在我的应用程序中,有多个异步任务。请让我知道为什么异步任务的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) {
}
}