У меня есть два Activity (mainActivity & downloadActivity) и у меня 2 AsyncTask в downloadActivity

В downloadActivity сначала выполняется getFileAsyncTask для чтения файла JSON для добавления некоторых изображений и создания ListView из изображений, если пользователь нажимает на изображение, вызывается downloadAsyncTask и он начинает что-то скачивать из Интернета. Моя проблема здесь: когда работает второй AsyncTask, я возвращаюсь к mainActivity и снова возвращаюсь к downloadActivity, первый AsyncTask не был вызван до тех пор, пока downloadAsyncTask завершенный.

public class downloadActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        new getFileAsyncTask().execute();
        ...
    }
    private class getFileAsyncTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
        //fetch a json file from internet and add images in ListView
            return null;
        }
    }
    //there is a Base Adapter class 
    //if user clicks on an image it calls this downloadAsyncTask.execute()
    private class downloadAsyncTask extends AsyncTask<Void, Integer, Void> {
        @Override
        protected void onPreExecute() {
        //download the file
        }
    }

    @Override
    protected Void doInBackground(Void... unused) {
        //download the file
    }
}

примечание: я хочу написать что-то вроде приложений для покупок. Например, пользователь может загрузить файл и зайти в магазин, чтобы увидеть товары.

7
Saeed Masoumi 28 Май 2014 в 16:09

4 ответа

Лучший ответ

Если вы хотите запустить несколько AsyncTasks параллельно, вы можете вызвать executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) вместо execute() для своей задачи. По умолчанию AsyncTasks запускаются последовательно, первым пришел - первым обслужен.

Будьте осторожны, чтобы два потока не взаимодействовали с одними и теми же данными, это может вызвать некоторые странные и трудно отслеживаемые ошибки.

16
Andrew Schuster 28 Май 2014 в 12:31

Вы можете сделать это в одном асинхронном классе, у которого есть два метода: сначала получить json-файл, дождаться ответа в doInBackground ... если все в порядке, вызовите метод загрузки файла. Эти методы вернут объект httpResponse

0
Lucian Novac 28 Май 2014 в 12:15

Вы можете переопределить функцию onBackPressed в действии и завершить текущее действие, прежде чем перейти к предыдущему действию. Когда вы снова заходите в downloadActivity, он вызывает метод oncreate и сначала вызывает AsynctTask.

0
Nooruddin Lakhani 28 Май 2014 в 12:56

Сделайте одну задачу класса, например:

Объявите индикатор выполнения глобально в основном потоке.

Теперь вам нужно запустить одну асинхронную задачу в основном потоке, например:

public class myactivity extends Activity {
    private ProgressDialog _dialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base_screen);
        new abc().execute();
    }

    class abc extends AsyncTask(String,String,String) {
        @Override
        protected void onPreExecute() {
            _dialog = new ProgressDialog(_ctx);
            _dialog.setCancelable(false);
            _dialog.setMessage("Loading");
            _dialog.show();
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {
            @Override
            protected void onPostExecute(String result) {
                // in post execute of this class you can run a new thread of your downaloder thread. and in post execute of last thread you have to dismiss the progess bar.
                new download activity.execute();
                }
            } 
        }
    }
}
0
gotwo 25 Апр 2020 в 12:52