AsyncTask 错误java.lang.IllegalStateException: Cannot execute task: the task has already been executed

问题:

Android开发在使用AsyncTask做计算线程的时候,使用了单例模式获取task的对象(以保证下一个Activtiy获取的是同一个对象);

在从下一个Activtity回到原来Actitvity的时候,不做任何操作,直接点击“运算”按钮,会出现如题的错误。


错误Log如下:

E/AndroidRuntime(10626): FATAL EXCEPTION: main
E/AndroidRuntime(10626): Process: com.jrdcom.perf, PID: 10626
E/AndroidRuntime(10626): java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
E/AndroidRuntime(10626): 	at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:583)
E/AndroidRuntime(10626): 	at android.os.AsyncTask.execute(AsyncTask.java:539)
E/AndroidRuntime(10626): 	at com.jrdcom.perf.LogListActivity$2.onClick(LogListActivity.java:150)
E/AndroidRuntime(10626): 	at android.view.View.performClick(View.java:4781)
E/AndroidRuntime(10626): 	at android.view.View$PerformClick.run(View.java:19874)
E/AndroidRuntime(10626): 	at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime(10626): 	at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(10626): 	at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(10626): 	at android.app.ActivityThread.main(ActivityThread.java:5329)
E/AndroidRuntime(10626): 	at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(10626): 	at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(10626): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:940)
E/AndroidRuntime(10626): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:735)
I/ActivityManager(  772): handleApplicationCrash


原因:


AsyncTask 本身设计如此,不适合多任务同时运行,execute()只能被执行一次(同一个对象);如过要一次执行多个任务用executeOnExecutor()。


解决方式:


1. 不使用单例,每次执行的时候会 new AsyncTask 。自然不会产生此问题。 ---一般用这种方法
2. 计算线程换用 Thread + Handler实现。
3. 在原Activity 的onResume()函数中加上对Task对象的置空处理即可,从而每次退回到原Activity并从新计算的时候会有个新的对象。


Task类中:


    public static ParseDataTaskPresenter getInstance() {
        if (mParseDataTaskPresenter == null) {
            mParseDataTaskPresenter = new ParseDataTaskPresenter();
        }
        return mParseDataTaskPresenter;
    }

    public static void flushParseDataTaskPresenter() {
        if (mParseDataTaskPresenter != null) {
            mParseDataTaskPresenter = null;
        }
    }


原Activity :

    @Override
    protected void onResume() {
        Logger.d("loglist onResume do");
        ParseDataTaskPresenter.flushParseDataTaskPresenter();
        super.onResume();
    }











 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卜溪大人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值