2016-06-10 78 views
-1

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

/* 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) { 
    } 
} 
+0

哪里是你的代码的例子吗? –

+0

请检查验证码。 –

回答

0

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

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

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

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

0

doInBackground应该在执行之前使用布尔值在循环上运行。在执行任务之前,设置一个全局布尔值(可能为true/false)取决于你喜欢哪个,线程上的值应该调用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) { 
    } 
} 
1

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

这里是一个如何正确地处理多个AsyncTasks AsyncTaskManager

+0

真的很有帮助。你能给我举一个例子说明我如何实现这一点,意味着我可以限制呼叫asynctasks。 –

+0

如果你真的需要太多的AsyncTaks,那么你需要改变池大小。这里是一个例子:[AsyncTaskManager](https://developer.android.com/training/multiple-threads/create-threadpool.html?hl=pt-br) – ikkarion