2011-07-07 56 views
1

我是android开发新手。我想完成描述任务如下:处理UI的Android异步任务

  • 主activty它调用外部类(其他类将扩大AsyncTask)来解析xml和请求的Web服务接收json并启动ProgressDialog
  • 该类执行xmljson解析其doInBackground方法。
  • 在解析完成后的onPostExecute方法中,关闭主活动中设置的ProgressDialog
  • 我可以通过将ProgressDialog对象传递给解析类并在其onPostExecute方法中关闭同一对象。

我想通过UI对象的实例作为参数不是一个好方法程序,希望必须有一些其他的方式来解决。

请建议。 谢谢

回答

4

脱钩这些最简单的方法是使用一个接口:

  1. 定义回拨接口(姑且称之为WorkDoneListener)有一个方法:workDone()
  2. 声明您的活动类以实施WorkDoneListener并实施workDone()以关闭对话框。
  3. 定义AsyncTask的构造函数以接受WorkDoneListener。将参考存放在成员字段中。
  4. onPostExecute中,调用听众的方法workDone()
+2

+1 :)在理论上,他仍然会这样,我引用了“将实例传递给AsyncTask”。我想知道OP是否在印象之下复制整个实例? – JustDanyul

+2

好点。就像在Java中所有这样的调用中一样,实例不会被复制,这既是好事也是坏事。好,因为它不会创建没有好理由的对象。不好的,因为这可能是内存泄漏的来源,特别是如果异步任务需要在配置更改的情况下继续工作,会导致活动中断。 –

+1

是的,如果参考未清除,您将在方向开关上泄漏原始活动及其所有视图。当活动正在消失时,您需要处理这种情况,并在活动重新创建后分离并重新附加。 – dmon

1

Ted的回答是,如果你的AsyncTask太大,你要声明它在其他文件中,你应该做的。但是,请记住,通常你声明AsyncTask你的UI类中:

public class YourActivity extends Activity{ 
    private class YourAsyncTask extends AsynkTask<etc.>{ 
    } 
} 

事实上,如果你正在使用你AsyncTask仅从这一活动(我的意思是,如果你不使用任何其他地方)宣布AsyncTask作为一个内部类是一个很好的设计实践。