Android,单例异步任务

Android,单例异步任务,android,android-asynctask,Android,Android Asynctask,是否有可能定义AsyncTask的单个实例,而不是在每个类中定义 还是设计为针对每项活动单独定义 我有4-5个活动,每个活动都有不同的url请求,对于url的响应,我定义了一个单独的类,其中包含根据请求解析和填充对象的方法 编辑:我在上面犯了一个错误。实际上,我应该定义一个从AsyncTask扩展的类,还是在每个活动中定义一个私有类 对不起,我有点困惑 谢谢。否,因为异步任务只能执行一次(如果尝试第二次执行,将引发异常)。因此,每次执行AsyncTask时,您都必须创建一个新的实例。我亲爱的朋友

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

还是设计为针对每项活动单独定义

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

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

对不起,我有点困惑


谢谢。

否,因为
异步任务只能执行一次(如果尝试第二次执行,将引发异常)。因此,每次执行
AsyncTask
时,您都必须创建一个新的实例。

我亲爱的朋友,您可以这样做,但不推荐这样做。如果您仍然想要实现它,那么创建一个BaseActivity类来实现AsyncTask和override url函数但要记住一件事:,不要忘记关闭,在切换活动期间暂停asynctask实例

Is there any possibility of defining a single instance of AsyncTask, rather than defining in every class ?
如果您唯一关心的是在单独的文件中定义它,那么
YES
,这是可能和有效的

缺点:

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

它可能会尝试回调不再存在的活动,因为用户可能已进一步移动

编辑:

如果您是android开发的初学者,为了简单起见,我建议在需要的每个活动中定义一个私有类

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

希望这对您有所帮助:

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类并使用它,然后在不同的地方使用您的结果制作一些东西。

为什么要在每个任务中创建它?只需定义一个类,执行它并覆盖onPostExecuteput,但只有在asyntask中si在网络上执行的代码意味着在asyntask中执行请求。然后根据您得到的内容代表您处理响应。通过创建一个简单的异步任务类,传递活动的上下文并从不同的活动中使用它。您认为用于执行异步操作的片段是什么?您可以在任何活动中使用它,而且它也可以重用。参考:@A.S.我想避免多个定义。我不是在问实例,我是在问定义。目前,我在示例中看到并完成的是定义了一个从AsyncTask扩展而来的私有类。@user3141985通常它被定义为一个可以访问封闭上下文的内部类,但可以肯定的是,您可以有一个单独的顶级类来扩展AsyncTask,并将上下文作为参数传递给构造函数。但是请注意,在异步任务执行期间,它所持有的上下文可能很容易变得无效(活动可能会被销毁)。尽管在中提到了这一点,但在线程规则的标题下,从这里更容易找到它。谢谢。定义AsyncTask的正确方案是什么?应该在需要的地方为每个活动定义AsyncTask,还是从那里定义并执行单个AsyncTask。为了避免同时执行多个任务,我可以设置一个标志,如果AsyncTask正在执行,则可以检查该标志。只需在BaseActivity类中实现aysnctask,并在ActivityA、ActivityB和singleInstance模式中实现它。每个类中都会有一个asynctask实例,因此每次执行都将并行进行。因此,多重执行不会有问题Show flag是否是一个错误的选择,以避免在实例已在执行时多次执行AsyncTask?Bro,将不需要标志,因为每个活动都将有其自己的AsyncTask函数实例。如何正确处理这些缺点?这很好,一旦它可见,人们就可以获得更多的洞察力。谢谢:)如果有帮助,请接受它作为答案并投赞成票;)这就是为什么我要做一个艰难的决定,不能同时选择两个答案,但为您+1:),再次感谢:)@a.S:很好。有没有办法显示进度对话框?当然,只需覆盖onPreExecute,在那里启动Progressdialog,然后在onPostExecute上关闭它
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");
    }
}