doInBackground有时不会被称为Android

doInBackground有时不会被称为Android,android,android-asynctask,Android,Android Asynctask,在我的应用程序中,有多个异步任务。请告诉我为什么异步任务的后台有时不会被调用。它的onPreExecute方法被调用。由于多个异步任务或其他原因是否存在任何问题 /* ASync class for test table */ public class TestAsynch extends AsyncTask<String, Void, String>{ protected void onPreExecute() { super.onPr

在我的应用程序中,有多个异步任务。请告诉我为什么异步任务的后台有时不会被调用。它的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) {
    }
}
测试表的异步类*/ 公共类TestAsynch扩展了异步任务{ 受保护的void onPreExecute(){ super.onPreExecute(); } @凌驾 受保护的字符串doInBackground(字符串…参数){ 字符串状态=空; 字符串result1=API_Manager.getInstance().sendTestData(用户名); 试一试{ 如果(result1!=null){ //保存在数据库中 } } } 捕获(例外e){ e、 printStackTrace(); } 返回状态; } @凌驾 受保护的void onPostExecute(字符串状态){ } } 在UI线程上调用OnPreExecute(),在后台线程上调用doInBackground()

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


现在,假设您有多个异步任务实例,我假设您正在调用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) {
}
}
公共类TestAsynch扩展了异步任务{
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串状态=空;
字符串result1=API_Manager.getInstance().sendTestData(用户名);
试一试{
如果(result1!=null){
//保存在数据库中
}
}
}
捕获(例外e){
e、 printStackTrace();
}
返回状态;
}
@凌驾
受保护的void onPostExecute(字符串状态){
}
}
对此

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) {
    }
}
公共类TestAsynch扩展了异步任务{
字符串result1=null;
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串状态=空;
result1=API_Manager.getInstance().sendTestData(用户名);
while(startExecute){
线程exe=新线程(新可运行(){
@凌驾
公开募捐{
试一试{
睡眠(5);
}
捕获(例外e){
e、 printStackTrace();
}
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
如果(result1!=null){
//保存在数据库中
}   
}
});
}
});exe.start();
}
返回状态;
}
@凌驾
受保护的void onPostExecute(字符串状态){
}
}

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


下面是一个如何正确处理多个异步任务的示例

代码在哪里?非常有用。能否请您提供一个示例,说明如何实现这一点,即如何限制调用asynctasks。如果确实需要太多AsyncTak,则需要更改池大小。以下是一个例子: