0

我的应用程序具有 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 的子类?如果不是我能做什么?

4

3 回答 3

2

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

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

execute()但是,请注意,根据文档,每次需要调用时都需要创建一个新实例

该任务只能执行一次(如果尝试第二次执行将引发异常。)

于 2013-05-22T22:15:11.517 回答
2

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

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

我可能只会为每笔交易完成一项任务。

于 2013-05-22T22:15:52.367 回答
1

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

  • 在单独的线程中执行事务
  • 每个线程都必须从 Service 启动
  • 保留事务使用数据库的状态(不要将状态保存在内存中)
  • 使用同步适配器。不确定它是否适合您(这取决于您的需求)
于 2013-05-23T09:08:16.573 回答