And*_*ázi 5 android design-patterns reusability android-asynctask android-activity
我的项目中有几个Activity子类,每个子类都调用一个基于SOAP的Web服务,处理并显示结果.SOAP序列化,调用处理和将结果解析为各种POJO对象都封装在MyWebService类中.该类通过AsyncTask执行实际的Web服务调用.
为了能够将结果传递回调用的Activity子类,我想我强制所有这些活动都应该实现一个WebServiceResultProcessor接口,定义一个函数(processWebServiceResults)作为AsyncTask的回调,从onPostExecute调用.
我还想在Web服务调用期间显示ProgressDialog.这是我的问题.为了能够显示ProgressDialog(来自MyWebService或它的AsyncTask),我需要传递对调用者Activity的Context的引用.并且为了能够从AsyncTask执行回调函数,我还需要传递相同的对象引用,但这次是作为WebServiceResultProcessor.这在我看来是一种代码气味,两次传递相同的物体,但是看不到任何方法.我可以创建一个新的基类,扩展Activity类并从扩展类强制继承,而不是接口,但这意味着我将使用此MyWebService类排除ListActivity等.
有一个更好的方法吗?
尽管 Arhimed 发出警告,我最终还是使用了 AsyncTask,因为它仍然符合我的目的。我只是确保所有调用 Web 服务的活动在其上onDestroy()发送 acancel()到调用的 AsyncTask。AsyncTask 实现本身通过在必要时检查 isCancelled() 来优雅地处理取消请求。
至于原来的问题,我一定是犯了一个错误——解决方案非常简单。我将 Activity 子类实例作为对象传递给 AsyncTask,并根据需要将其转换为 Context 或 WebServiceResultProcessor。显示其工作原理的片段:
if (callerActivity instanceof Context) {
ProgressDialog dialog = new ProgressDialog((Context)callerActivity);
}
Run Code Online (Sandbox Code Playgroud)
...
if (callerActivity instanceof WebServiceResultProcessor) {
((WebServiceResultProcessor)callerActivity).processWebServiceResults(soapObject);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1252 次 |
| 最近记录: |