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

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

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 Ответ

4 голосов
/ 16 октября 2011

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

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

...