1

本文底部的代码由以下代码行触发。

new MasterClickAsyncTask(main).execute(position);

下面代码的 doInBackground 部分调用了一个包含 for 循环的方法,因此需要 Looper.prepare()。

此代码在前几次调用时运行良好,但随后引发以下错误:

10-15 22:50:24.752: ERROR/AndroidRuntime(9258): Caused by: java.lang.RuntimeException: 每个线程只能创建一个 Looper

我试过把 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);
}   
}
4

1 回答 1

4

Looper 与 for 循环无关。Looper 是 Android 系统中控制 UI 线程的部分。如果没有准备好弯针,有几件事是行不通的,但总的来说,Looper.prepare();除非绝对必要,否则最好避免。最好使用 asyncdoInBackground来执行数据处理或其他更长的操作,然后使用onPostExecute和更新 UI onProgressUpdate

简而言之,除非您以某种方式使用 UI,否则您不需要调用 Looper。如果您发现自己不得不调用 Looper,您可能需要重新构建后台线程的工作方式。

于 2011-10-15T23:11:08.480 回答