【问题标题】:Android, Singleton AsyncTaskAndroid,单例异步任务
【发布时间】:2014-03-25 16:52:13
【问题描述】:

是否有可能定义单个 AsyncTask 实例,而不是在每个类中定义?

或者它被设计为为每个活动单独定义?

我有 4-5 个活动,每个活动都有不同的 url 来请求,对于 url 的响应,我定义了一个单独的类,其中包含根据请求解析和填充对象的方法。

编辑:我在上面犯了一个错误。实际上,我应该定义一个从 AsyncTask 扩展的类,还是在需要的每个 Activity 中定义一个私有类?

抱歉,我有点糊涂了。

谢谢。

【问题讨论】:

  • 为什么要在每个任务中创建它?只需定义一个类,执行它并覆盖 onPostExecute
  • 只把在网络上执行的 asyntask 中的代码表示在 asyntask 中执行请求。然后根据您得到的信息代表您处理响应。
  • 通过创建一个简单的异步任务类来传递活动的上下文并使用来自不同活动的上下文
  • 您如何看待用于执行异步操作的片段?你可以在任何活动中使用它,它也可以重复使用。参考:this
  • @A.S.我想避免多重定义。

标签: android android-asynctask


【解决方案1】:

不可以,因为AsyncTask 只能执行一次(如果尝试第二次执行将引发异常)。所以每次你想执行它时都必须创建一个AsyncTask 的新实例。

【讨论】:

  • 我不是在问实例,我是在问定义。目前我在示例中看到并完成的是定义了一个从 AsyncTask 扩展的私有类。
  • @user3141985 通常它被定义为可以访问封闭上下文的内部类,但可以肯定的是,您可以拥有一个单独的顶级类来扩展 AsyncTask 并将上下文作为参数传递给构造函数.但请注意,在 AsyncTask 执行期间,它所持有的上下文很容易变得无效(活动可能被破坏)。
  • 虽然developer.android.com/reference/android/os/AsyncTask.html 中提到了这一点,但在线程规则的标题下,从这里更容易找到它。谢谢。
【解决方案2】:

希望对您有所帮助:

public class MyAsynctask extends AsyncTask<String, Integer, Integer> {

    @Override
    protected Integer doInBackground(String... params) {
        int i = 0;

        for (int x = 0; x < 500; x++) {
            i++;
        }
        return i;
    }

    @Override
    protected void onPostExecute(Integer result) {

        super.onPostExecute(result);
    }

}

使用 Asynctask 的活动:

public class MyAsyncUser extends Activity{

    int result;
    TextView view;
    public void onCreate(android.os.Bundle savedInstanceState) {

        view = new TextView(this);

        new MyAsynctask(){
            protected void onPostExecute(Integer result) {
                view.setText("" + result);
            }       
        }.execute("what to do");
    }
}

因此,您可以定义一个 Asynctask 类并使用它,并在不同的地方用您的结果制作一些东西。

【讨论】:

  • 这很好,一旦它可见,人们可以得到更多的洞察力。谢谢:)
  • 如果有帮助,请接受它作为答案并给予支持;)这就是 SO 的工作原理
  • 我做了一个艰难的决定,不能一次选择两个答案,但为你 +1 :),再次感谢 :)
  • @A.S.:不错。有什么方法可以显示进度对话框吗?
  • 当然只是覆盖 onPreExecute,在那里启动 Progressdialog 并在 onPostExecute 上关闭它
【解决方案3】:

亲爱的朋友,可以,但不建议在你的情况下。如果还想实现,那就创建一个 BaseActivity 类来实现 AsyncTask 并覆盖 url 函数。 但要记住一件事:,不要忘记在活动切换期间关闭、暂停 asynctask 实例。

【讨论】:

  • 定义 AsyncTask 的正确场景是什么,应该为每个需要的活动定义它,还是单个定义并从那里执行。为了避免同时执行多个,我可以设置一个标志,可以检查 AsyncTask 是否正在执行。
  • 不,亲爱的,设置标志是一种选择。只需在您的 BaseActivity 类中实现 aysnctask 并在您的 ActivityA、ActivityB 中以 singleInstance 模式实现它。每个类中都会有一个 asynctask 实例,因此每次执行都将并行进行。所以,不会有多次执行的问题
  • 如何标记一个错误的选择来避免在实例已经在执行时多次执行 AsyncTask ?
  • 兄弟,不需要标志,因为每个活动都有自己的异步任务函数实例。
【解决方案4】:
Is there any possibility of defining a single instance of AsyncTask, rather than defining in every class ?

如果您唯一关心的是在单独的文件中定义它,那么 YES 是可能且有效的。

缺点:

如果您尝试在那里显示进度对话框,它可能会泄漏活动上下文。

它可能会尝试对不再存在的活动进行回调,因为用户可能已经移动得更远了。

编辑:

如果你是android开发的初学者,为了简单起见,我建议define a private class inside each Activity where required

如果您有经验,请尝试使用 Fragment 进行异步操作,如 here 所述

【讨论】:

  • 如何正确处理这些弊端?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2021-07-05
  • 2020-08-30
  • 2016-11-23
相关资源
最近更新 更多