android可以延迟或暂停我的异步任务吗?

时间:2016-12-13 23:01:40

标签: android android-asynctask

有可能因为某种原因,Android操作系统可能会延迟或暂停我的asynctask。如果是这样,我该怎么做才能确保我的任务(例如从数据库中获取数据)不会延迟或暂停。可能在UI线程上运行它,但我已经读过它不是一个好主意,因为它可以冻结UI并导致滞后。

2 个答案:

答案 0 :(得分:2)

  

有可能因为某种原因,Android操作系统可能会延迟或暂停我的asynctask。

它可能被另一个AsyncTask实例阻止。默认情况下,它们在单个后台线程上运行:https://developer.android.com/reference/android/os/AsyncTask.html

  

如果是这样,我该怎么做才能确保我的任务(例如从数据库中提取数据)不会延迟或暂停。

调查导致延迟的原因。它是doInBackground方法中的内容还是在后台操作之前或之后发生延迟。它可以是任何东西,没有调试代码很难说。

  

在UI线程上运行它可能但我已经读过它不是一个好主意,因为它可以冻结UI并导致滞后。

虽然AsyncTask在这种情况下不是一个好的解决方案,但如果你正确实现它应该可以正常工作。其他需要考虑的方法是Loader,或AsyncQueryHandlerContentProvider。取决于您的用例。

答案 1 :(得分:0)

@覆盖         protected void onPreExecute(){             holdWait = false;             stop = false;         }

    @Override
    protected Void doInBackground(Void... params) {
        synchronized (this) {
            while(true) {
                if(Work) return null;
                if(HaveWork) {
                    //make some
                } else {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        return null;
    }

    public void mynotify() {
        synchronized (this) {
            if(holdWait) {
                notify();
                holdWait = false;
            }
        }
    }

    public void setStopWork() {
        synchronized (this) {
            stop= false;
            if(holdWait) {
                notify();
                holdWait = false;
            }
        }
    }
}