2016-06-10 4 views
-1

В моем приложении есть несколько asynctasks. Пожалуйста, дайте мне знать, почему doInBackground из asynctask иногда не вызывается. Вызывается метод onPreExecute. Есть ли проблема из-за множества асинтак или чего-то еще?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

PLS чековая книжка. –

ответ

0

OnPreExecute() вызывается в потоке пользовательского интерфейса и doInBackground() вызывается на фоне потока.

Для задачи async есть один выделенный фоновый поток. Такое поведение можно изменить, если хотите.

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

Теперь у вас есть несколько экземпляров асинхронной задачи, и я предполагаю, что вы вызываете выполнить() для выполнения задач, асинхронных. Это приведет к запуску всего preExecute сразу же после того, как поток пользовательского интерфейса будет бесплатным, но для doInBackground он будет запускаться один за другим. Следовательно, для следующей задачи async может потребоваться некоторое время.

0

doInBackground должен работать в цикле, используя логическое значение для проверки перед выполнением. Перед выполнением задачи задайте глобальное логическое значение (может быть true/false), которое зависит от того, что вы предпочитаете, а значения add в потоке должны вызывать 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

Действительно полезно. Можете ли вы привести мне пример того, как я могу это реализовать, так как я могу ограничить вызов асинтетов. –

+0

Если вам действительно нужно слишком много AsyncTaks, вам нужно изменить размер пула. Вот пример: [AsyncTaskManager] (https://developer.android.com/training/multiple-threads/create-threadpool.html?hl=pt-br) – ikkarion

Смежные вопросы