1

この投稿の下部にあるコードは、次のコード行によってトリガーされます。

new MasterClickAsyncTask(main).execute(position);

以下のコードのdoInBackground部分は、forループを含むメソッドを呼び出すため、Looper.prepare()が必要です。

このコードは、呼び出された最初の数回は正常に実行されますが、その後、次のエラーがスローされます。

10-15 22:50:24.752:エラー/ AndroidRuntime(9258):原因:java.lang.RuntimeException:スレッドごとに作成できるルーパーは1つだけです

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は、UIスレッドを制御するAndroidシステムの一部です。ルーパーを準備しないと機能しないことがいくつかありますが、一般的には、Looper.prepare();どうしても必要な場合を除いて、避けるのが最善です。非同期doInBackgroundを使用してデータ処理やその他のより長い操作を実行してから、とでUIを更新することをonPostExecuteお勧めしonProgressUpdateます。

つまり、何らかの方法でUIを使用していない限り、Looperを呼び出す必要はありません。Looperを呼び出さなければならない場合は、バックグラウンドスレッドの動作を再構築する必要があります。

于 2011-10-15T23:11:08.480 に答える