Возврат данных из AsyncTask без блокировки пользовательского интерфейса

У меня есть концептуальная проблема, связанная с классом AsyncTask . Мы используем AsyncTask так, чтобы основной пользовательский интерфейс не был заблокирован. Но предположим, я хочу получить некоторые данные из памяти устройства, и для этого я использую класс AsyncTask. Соответствующая строка кода будет выглядеть следующим образом (при условии, что тип данных возвращен String):

  //code String data = new ExtendedAsyncTask().execute(param1, param2).get(); //use this returned value. 

Не будет ли вышеуказанная строка блокировать пользовательский интерфейс, победив цель использования AsyncTask ? Если да, то как я могу получить соответствующие данные без блокировки пользовательского интерфейса? Я хотел бы добавить, что следующей строке кода понадобятся эти данные для выполнения некоторой задачи и, следовательно, зависит от возвращаемого значения.

благодаря

get() method will block the UI thread . Чтобы получить релевантные данные, вам нужно вернуть значение из doInBackground и зафиксировать значение в параметре onPostExecute.

Значение, возвращаемое doInBackground, захватывается методом onPostExecute

Пример:

 public class BackgroundTask extends AsyncTask<String, Integer, String >{ private ProgressDialog mProgressDialog; int progress; public BackgroundTask() { mProgressDialog = new ProgressDialog(context); mProgressDialog.setMax(100); mProgressDialog.setProgress(0); } @Override protected void onPreExecute() { mProgressDialog =ProgressDialog.show(context, "", "Loading...",true,false); super.onPreExecute(); } @Override protected void onProgressUpdate(Integer... values) { setProgress(values[0]); } @Override protected String doInBackground(String... params) { String data=getDatafromMemoryCard(); return data; // return data you want to use here } @Override protected void onPostExecute(String result) { // result is data returned by doInBackground Toast.makeText(context, result, Toast.LENGTH_LONG).show(); mProgressDialog.dismiss(); super.onPostExecute(result); } } 

Если вы используете asynctask в отдельном классе, используйте AsyncTask с интерфейсом обратного вызова, подобным этому

Вот ответ, который я предоставил ранее о той же AsyncTask с обратным вызовом

Вы не получите результат таким образом. См. Эту ссылку для примера: https://github.com/levinotik/ReusableAsyncTask/tree/master/src/com/example

В основном, вот что вам нужно сделать:

  • Определите интерфейс (= слушатель), который ваша деятельность реализует
  • Установите слушателя в асинтете
  • Вызовите yourListener.yourMethod () в onPostExecute

Когда выполняется асинхронная задача, задача выполняет 4 этапа:

 1.onPreExecute(), invoked on the UI thread before the task is executed. use this to diaply progress dialog. 2.doInBackground(Params...), invoked on the background thread immediately after onPreExecute() finishes executing. Can also use publishProgress(Progress...) to publish one or more units of progress. These values are published on the UI thread, in the onProgressUpdate(Progress...) step. 3.onProgressUpdate(Progress...), invoked on the UI thread after a call to publishProgress(Progress...). Used to publish progress. 4.onPostExecute(Result), invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter. 

В вашей деятельности onCreate ()

  TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv= (TextView)findViewById(R.id.textView); new TheTask().execute(); } class TheTask extends AsyncTask<Void, Void,String> { protected void onPreExecute() { //dispaly progress dialog } protected String doInBackground(Void... params) { //do network operation return "hello"; } protected void onPostExecute(String result) { //dismiss dialog. //set hello to textview //use the returned value here. tv.setText(result.toString()); } } 

Рассмотрим использование robospice (альтернатива AsyncTask. https://github.com/octo-online/robospice .

Выполнять асинхронные вызовы, уведомлять о потоке ui.

Intereting Posts
Как предотвратить перезагрузку exoplayer в случае поиска назад? Как я могу получить доступ к частным API-интерфейсам Android, которые не отображаются в TelephonyManager? Настройка голографической темы в Honeycomb Thrift клиент на Android Как изменить тему настроек в Android? WhatsApp как групповой чат в android с помощью xmpp и asmack Поддержка языка хинди для Android – текст отображается в виде ящиков Какие папки макета необходимы для поддержки всех Android-устройств? Цикл всех «виджетов» / элементов в действии Может ли Messenger (облегченная альтернатива AIDL) использоваться для межпротокольной связи? Нажатие на пункты меню панели действий в Robotium Обновление TextView каждую секунду Сообщение нескольких платформ через AWS SNS с aws-ruby-sdk Можно ли отключить () безопасно вызвать из другого потока, чтобы отменить текущее соединение HttpURLConnection? Как создать структуру тестового каталога проекта в Android Studio?