2014-02-15 3 views
0

У меня возникли проблемы с попыткой попасть в onPostExecute, чтобы запустить этот кусок кода, я новичок в java и особенно многопоточность, поэтому, если то, что я делаю, совершенно неправильно, пожалуйста, не стесняйтесь исправить меня .. чтобы учиться.onPostExecute не называется

Так что проблема с этим:

public class DataTask extends AsyncTask<Void, Void, Integer> { 

Context context; 
    DataTask(Context context) { 
     this.context = context.getApplicationContext();   
    } 
// Global Int for counting how many Tasks have been completed 
    int asynCount = 0; 

    ArrayList<String> arr_dataVts=new ArrayList<String>(); 
    ArrayList<String> arr_dataNtm=new ArrayList<String>(); 
    ArrayList<String> arr_dataOdas=new ArrayList<String>(); 
    ArrayList<String> arr_dataMetAll=new ArrayList<String>(); 
    ArrayList<String> arr_dataMet3HrTask=new ArrayList<String>(); 
    ArrayList<String> arr_dataTideTask=new ArrayList<String>(); 

@Override 
protected Integer doInBackground(Void... params) { 

    //VtsAsyncTask 
    VtsTask task1 = new VtsTask(); 
    task1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    //NtmAsyncTask 
    NtmTask task2 = new NtmTask(); 
    task2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    //OdasAsyncTask 
    OdasTask task3 = new OdasTask(); 
    task3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    //MetAllTask 
    MetAllTask task4 = new MetAllTask(); 
    task4.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    //Met3HrTask 
    Met3HrTask task5 = new Met3HrTask(); 
    task5.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    //TideTask 
    TideTask task6 = new TideTask(); 
    task6.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

    return 1; 
} 

Все задачи выполняются как следует делать

, но здесь, в onPostExecute:

@Override 
protected void onPostExecute(Integer result) { 
     if (asynCount == 6){ 
     //start intents for main activity 
     System.out.println("asynCount has reached= " + asynCount + " so now starting MainActivity"); 
      Intent intent = new Intent(context, MainActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      intent.putStringArrayListExtra("data1", arr_dataVts); 
      intent.putStringArrayListExtra("data2", arr_dataNtm); 
      intent.putStringArrayListExtra("data3", arr_dataOdas); 
      intent.putStringArrayListExtra("data4", arr_dataMetAll); 
      intent.putStringArrayListExtra("data5", arr_dataMet3HrTask); 
      intent.putStringArrayListExtra("data6", arr_dataTideTask); 
     // context.startActivity(intent); 
    }else{ 
     //update dialogue 
    } 
    } 
} 

onPostExecute никогда не вызывается? Я не знаю почему. Я попытался использовать целые числа, Void и Booleans, чтобы вернуть их, но не работает. Все советы приветствуются. EDIT: Теперь я понимаю, что я действительно должен использовать Bundle здесь для всех дополнительных функций.

ответ

2

Ваш DataTask класс не нужен. Единственное, что вы делаете в фоновом режиме, это запустить несколько других AsyncTask, вам не нужно обертывать все эти команды execute() внутри собственной AsyncTask, потому что они уже выполняются в фоновом потоке только по самой природе AsyncTask ,

Каждая из этих других задач, которые у вас есть, должна иметь свой собственный onPostExecute(), который обрабатывает результаты этой конкретной задачи и что-то делает с ней.

EDIT:

Вот некоторые псевдокод, как это может выглядеть, если вы объединены все свои операции в единую AsyncTask:

public class DataTask extends AsyncTask<Void, Void, Integer> { 

    Context context; 
    DataTask(Context context) { 
     this.context = context; // <-- you already have a context, you don't need to call getApplicationContext();  
    } 
    @Override 
    protected Integer doInBackground(Void... params) { 
     doSomeWork(); 
     doSomeOtherWork(); 
     doYetSomeMoreWork(); 
     //... 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     doSomethingWithThe(result); 
    } 
} 

doSomeWork() ... и т.д. методы не должны быть AsyncTasks, просто нормальные методы, чтобы они выполнялись последовательно. Таким образом, когда все они будут завершены, будет вызван onPostExecute().

+0

Привет, Причина, по которой это было в его собственном классе, состояла в том, чтобы я мог позвонить в любое время из своего приложения, чтобы обновить ui. Каким будет правильный метод ... вызывать все задачи индивидуально? –

+0

Да, вы могли бы назвать их по отдельности. Также, учитывая код, который вы опубликовали, похоже, что onPostExecute(), вероятно, вызывает вызов, но из-за вашего оператора if на самом деле ничего не делает. Вы инициализируете asycCount равным 0, а затем проверяете, равен ли он 6, которого он никогда не будет, потому что вы никогда не меняете его с 0. – FoamyGuy

+0

извините, моя вина. asynCount добавляется каждый раз, когда заканчивается одна из задач. Я не включил код для задач, но теперь буду делать это. –

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