【问题标题】:Do I need to use multiple AsyncTask subclasses?我需要使用多个 AsyncTask 子类吗?
【发布时间】:2013-05-22 22:02:52
【问题描述】:

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

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 的子类?如果不行,我该怎么办?

【问题讨论】:

    标签: java android multithreading task


    【解决方案1】:

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

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

    我可能只为每笔交易制定一项任务。

    【讨论】:

    • 如果这就是您所指的,将其设为Activity 的内部类是没有问题的。只要你只需要它在那个Activity
    • 我认为他们在其中一个 I/O 讲座中特别警告过这一点?我再检查一下。
    • 除非我误会,否则我没见过。如果你找到了请告诉我
    • 从 I/O 10 签出 this video
    • 谢谢!我会尽快看的
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-11-09
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        相关资源
        最近更新 更多