AsyncTask doInBackground (); выполнение нескольких методов один за другим - PullRequest
0 голосов
/ 03 мая 2018

У меня проблемы с AsyncTask при запуске нескольких методов в doInBackground. это мой AsyncTask код:

 public class FETCHDATA extends AsyncTask<Void, Void, Void> {


    @Override
    protected void onPreExecute() {
        pdialog = new ProgressDialog(getContext());
        pdialog.setTitle("Please Wait");
        pdialog.setMessage("Fetching data...");
        pdialog.show();
    }

    @Override
    protected Void doInBackground(Void... voids) {
    try{

        method1();
        method2();
        method3();
        method4();
        method5();
        method6();
        method7();

       }catch (Throwable e){
        e.printStackTrace();
       }
   }


   @Override
    protected void onPostExecute(Void aVoid) {
        if (pdialog.isShowing()){
            pdialog.dismiss();
        }

    }

Вместо запуска и ожидания первого метода doInBackground переходит к следующему методу. и ProgressDialog отклонение на одну секунду.

Примечание Каждый метод получит данные из нашего API и сохранит их на моем SQLiteDatabase.

ВОПРОС Как я могу выполнить свои методы, когда первый метод завершил получение и сохранение данных перед переходом ко вторым методам.

Ответы [ 5 ]

0 голосов
/ 03 мая 2018

Мне кажется, проблема в том, что все ваши методы или некоторые методы уже выполняются в отдельном потоке. Поэтому всякий раз, когда вы вызываете метод, который уже выполняется в отдельном потоке doInBackground(), то есть текущий поток не будет его ждать и продолжит выполнение.

Кроме того, способ, которым вы положили try-catch, не является правильным способом сделать это. Также, если вы хотите вызывать несколько потоков один за другим, вы должны использовать ThreadPoolExecuter.

Если вы не используете сетевую библиотеку Для выполнения вызовов API вы можете использовать RetroFit .

0 голосов
/ 03 мая 2018

Вы нарушаете использование асинхронной задачи. Асинхронная задача предназначена для выполнения коротких асинхронных операций и простого обновления пользовательского интерфейса до, во время и после нее. Она не предназначена для одновременного выполнения 7 сетевых и Sqlite операций.

Подробнее можно прочитать здесь: https://developer.android.com/reference/android/os/AsyncTask

Таким образом, вам нужно выполнить какую-то работу для себя, чтобы выполнить эти операции сразу или использовать некоторые популярные библиотеки, такие как Retrofit.

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

0 голосов
/ 03 мая 2018

Может быть, вам нужно создать несколько AsyncTask и каждый раз, когда первый метод завершает работу, сообщайте об этом, возвращая логический вместо экземпляра void здесь ---> extends AsyncTask.

0 голосов
/ 03 мая 2018

Это странно.

Я предполагаю, что ваш methodX() является асинхронным вызовом?

В этом случае вы можете использовать Thread.join() или CountDownLatch.

0 голосов
/ 03 мая 2018

В doInBackground можно поместить счетчик с указанием регистра переключателя, в котором вы выбираете метод для выполнения, а затем в onPostExecute вызов new FETCHDATA().execute() рекурсивно

РЕДАКТИРОВАТЬ: рабочий код (я забыл break; после case;)

int counter = 1; // global

class Fetchdata extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            switch (counter) {
                case 1:
                    method1();
                    break;
                case 2:
                    method2();
                    break;
                case 3:
                    method3();
                    break;
                case 4:
                    method4();
                    break;
                case 5:
                    method5();
                    break;
                default:
                    cancel(true);
                    counter = 1;
                    break;
            }


        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    protected void onPostExecute(Void aVoid) {
        counter+=1;
        Log.d(TAG, "onPostExecute: "+counter);
        // cancel(true);
        new Fetchdata().execute();
    }
}

void method1(){
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "methode1: coucou");
}

void method2(){
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "methode2: ");
}

void method3(){
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "methode3: ");
}

void method4(){
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "methode4: ");
}

void method5(){
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.d(TAG, "methode5: ");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...