doInBackground有时不会被称为Android



在我的应用程序中,有多个异步任务。请让我知道为什么异步任务的doInBackground有时不会被调用。它的onPreExecute方法被调用。由于多个异步任务或其他原因,是否有任何问题?

/* ASync class for test table  */
    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) {
    }
}

如果您的项目有多个异步任务,则必须检查是否可以执行的异步任务的限制。当您创建新的 AsyncTask 时,它将添加到池中,并且仅在可能的情况下执行。检查此答案:安卓上的多任务处理和文档:ThreadPoolExecutor

下面是一个关于如何正确处理多个AsyncTasks AsyncTaskManager的示例

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

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

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

现在,假设您

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

doInBackground应该使用布尔值在循环上运行,以便在执行前进行检查。在执行任务之前,设置一个全局布尔值(可能是真/假),具体取决于您喜欢哪个值,线程上的值添加应调用 runOnUiThread。

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) {
}
}

对此

public class TestAsynch extends AsyncTask<String, Void, String> {
    String result1 = null;
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(String... params) {
        String status = null;
        result1=API_Manager.getInstance().sendTestData(userName);
        while (startExecute) {
            Thread exe = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(5);
                    }
                    catch( Exception e) {
                        e.printStackTrace();
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if(result1 != null) {
                                // save in db
                            }   
                        }
                    });
                }
            }); exe.start();
        }
        return status;
    }
    @Override
    protected void onPostExecute(String status) {
    }
}

最新更新