Для одного потока может быть создан только один Looper. Ошибка, асинхронная задача

Код в нижней части этого поста запускается следующей строкой кода.

new MasterClickAsyncTask(main).execute(position);

Часть кода doInBackground ниже вызывает метод, содержащий цикл for, отсюда и необходимость в Looper.prepare().

Этот код работает нормально первые несколько раз, когда он вызывается, но затем выдает следующую ошибку:

10-15 22: 50: 24.752: ОШИБКА /AndroidRuntime(9258): вызвано: java.lang.RuntimeException: только один лупер может быть создан для потока

Я попытался положить Looper.getMainLooper(). Quit(); и несколько других подобных вещей в различных частях AsyncTask, но это только сразу привело к его аварийному завершению.

Любая помощь?

Код:

import java.io.IOException;
import java.net.MalformedURLException;
import org.json.JSONException;
import android.os.AsyncTask;
import android.os.Looper;
import android.view.View;

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

    Master selectedMaster;
Main main;
MasterGridView masterGridView;
Integer i;
DiscogProxy discogProxy = new DiscogProxy();

MasterClickAsyncTask(Main main){
    this.main = main;
    this.masterGridView = main.getMasterGridView();
}

@Override
    protected void onPreExecute() {
        main.progressBar.setVisibility(View.VISIBLE);
    }
       @Override
        protected Void doInBackground(Integer... params) {
            masterGridView.getSelectedView();
            Globals.selectedMaster = (Master)(masterGridView).getItemAtPosition(params[0].intValue());
            Globals.selectedMaster.getVersionListView().getVersionList().clear();
               Looper.prepare();
              try {
                  Globals.selectedMaster.getVersionListView().populateVersionList();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
               //Looper.getMainLooper().quit();
        return null;    
        }       

@Override
protected void onPostExecute(Void result) {
     main.populateAlbumVersionsView();
     main.progressBar.setVisibility(View.GONE);
}   
}

1 ответ

Решение

Лупер не имеет ничего общего с петлями. Looper является частью системы Android, которая контролирует поток пользовательского интерфейса. Есть несколько вещей, которые не будут работать без подготовки петлителя, но в целом лучше избегать Looper.prepare(); если это абсолютно необходимо. Гораздо лучше использовать асинхронный doInBackground выполнить обработку данных или другие более длительные операции, а затем обновить пользовательский интерфейс с onPostExecute а также onProgressUpdate,

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

Другие вопросы по тегам