doInBackground有时候不会被称为Android

时间:2016-06-10 10:50:29

标签: android android-asynctask

在我的应用程序中,有多个asynctasks。请让我知道为什么doInBackground的asynctask 有时没有被调用。它的onPreExecute方法被调用。是否有任何问题,因为有多个asynctasks或其他东西?

log4j.rootLogger=INFO, stdout1, proj1, proj2

3 个答案:

答案 0 :(得分:1)

如果您的项目有多个asynctasks,您必须检查是否存在可以执行的asynctasks限制。当您创建新的AsyncTask时,它将被添加到池中,并且只有在可能的情况下才会执行。 检查这个答案: Multitasking on android 文档:ThreadPoolExecutor

以下是有关如何正确处理多个AsyncTasks AsyncTaskManager

的示例

答案 1 :(得分:0)

在UI线程上调用OnPreExecute(),并在后台线程上调用doInBackground()。

异步任务有一个专用的后台线程。如果您愿意,可以更改此行为。

http://android-er.blogspot.in/2014/04/run-multi-asynctask-as-same-time.html

现在,假设您有多个异步任务实例,我假设您正在调用execute()来运行异步任务。这将立即触发所有preExecute,因为UI线程是空闲的,但对于doInBackground,它将逐个触发。因此,下一个异步任务可能需要一些时间才能启动。

答案 2 :(得分:0)

doInBackground应该在循环上运行,使用布尔值在执行前进行检查。在执行Task之前,设置一个全局布尔值(可能是true / false)取决于你喜欢哪个,并且在线程上添加的值应该调用runOnUiThread。

var f = pdfReader.IsOpenedWithFullPermissions; -> FALSE
var f1 = pdfReader.IsEncrypted(); - > FALSE
var f2 = pdfReader.ComputeUserPassword(); - > NULL
var f3 = pdfReader.Is128Key(); - > FALSE
var f4 = pdfReader.HasUsageRights();

然后改变这个

startExect = true;
new TestAsynch().execute();

到这个

public class TestAsynch extends AsyncTask<String, Void, String>{
     protected void onPreExecute() {
     super.onPreExecute();
}

@Override
protected String doInBackground(String... params) {
    String status = null;
    String result1=API_Manager.getInstance().sendTestData(userName);
    try {
        if(result1 != null) {
         // save in db
        }
    }
    }
    catch( Exception e) {
        e.printStackTrace();
        }
    return status;
}
@Override
protected void onPostExecute(String status) {
}
}