Для одного потока может быть создан только один 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, вам, вероятно, потребуется реструктурировать работу фоновых потоков.