У меня есть два 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
}
}
примечание: я хочу написать что-то вроде приложений для покупок. Например, пользователь может загрузить файл и зайти в магазин, чтобы увидеть товары.
4 ответа
Если вы хотите запустить несколько AsyncTasks
параллельно, вы можете вызвать executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
вместо execute()
для своей задачи. По умолчанию AsyncTasks
запускаются последовательно, первым пришел - первым обслужен.
Будьте осторожны, чтобы два потока не взаимодействовали с одними и теми же данными, это может вызвать некоторые странные и трудно отслеживаемые ошибки.
Вы можете сделать это в одном асинхронном классе, у которого есть два метода: сначала получить json-файл, дождаться ответа в doInBackground
... если все в порядке, вызовите метод загрузки файла. Эти методы вернут объект httpResponse
Вы можете переопределить функцию onBackPressed в действии и завершить текущее действие, прежде чем перейти к предыдущему действию. Когда вы снова заходите в downloadActivity, он вызывает метод oncreate и сначала вызывает AsynctTask.
Сделайте одну задачу класса, например:
Объявите индикатор выполнения глобально в основном потоке.
Теперь вам нужно запустить одну асинхронную задачу в основном потоке, например:
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();
}
}
}
}
}
Похожие вопросы
Связанные вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.