我是否需要使用多个AsyncTask子类?

时间:2013-05-22 22:02:53

标签: java android multithreading task

我的应用程序具有FTP功能,现在我想为各种操作实现ProgressDialog(连接,下载,上传,文件列表等) 我在堆栈上发现了这个片段,这似乎是一个很好的起点。

public class LoadData extends AsyncTask<Void, Void, Void> {
        ProgressDialog progressDialog;
        //declare other objects as per your need
        @Override
        protected void onPreExecute()
        {
            progressDialog= ProgressDialog.show(FTPConnector.this, "Please wait for ","Process Description Text", true);

            //do initialization of required objects objects here                
        };      
        @Override
        protected Void doInBackground(Void... params)
        {   

             //do loading operation here  
            return null;
        }       
        @Override
        protected void onPostExecute(Void result)
        {
            super.onPostExecute(result);
            progressDialog.dismiss();
        };
     }

我已经将它实现为我的FTPConnector类的子类,其中包含连接,下载,上传,列表文件,重命名,删除的各种方法。我是否需要为每个FTP操作创建ASyncTask的子类?如果不是我能做什么?

3 个答案:

答案 0 :(得分:2)

  

我是否需要为每个FTP操作创建ASyncTask的子类?

不一定,但这取决于您在AsyncTask方法中使用的逻辑。如果你让它们来处理操作所需的功能那么你就可以了。但是,根据每个操作的逻辑,如果为每个操作创建一个单独的类,则可能更容易控制。

但请注意,根据Docs

,每次需要致电execute()时,您都需要创建一个新实例
  

该任务只能执行一次(如果尝试第二次执行则会抛出异常。)

答案 1 :(得分:2)

首先,我认为使用AsyncTask作为活动的子类是不受欢迎的,因为任务将保留对启动它的活动的引用,这可能会导致问题。我通常使用AsyncTask作为自己的类,并在执行它的活动的上下文中传递。你应该研究一下。

其次,您可以为每个服务器事务执行不同的任务。我想这取决于你的应用程序的数量或复杂程度。除此之外,您可以在doInBackground方法中使用一个带有switch语句的类,并将字符串标记作为其中一个varargs传递(假设您的任务仅将字符串作为初始参数)。这看起来既麻烦又难看。

我可能只为每笔交易做一个任务。

答案 2 :(得分:1)

使用AsyncTask进行多个事务将起作用,但这不是正确的解决方案。如前所述:它可能会导致问题。我建议你看看this video(这是关于REST客户端,但描述的模式也适合你)。遵循以下规则:

  • 在单独的线程中执行交易
  • 必须从服务启动每个线程
  • 保留事务使用状态数据库(不要将状态保存在内存中)
  • 使用SyncAdapter。不确定它是否适合您(这取决于您的需求)