在几个活动中重用Android AsnycTask的模式?

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等.

有一个更好的方法吗?

And*_*ázi 0

尽管 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)