0

AsyncTaskLoader を処理しようとしています。Interface LoaderCallbacks を次のように実装しました。

public class MainActivity extends Activity implements LoaderCallbacks<String> {
...
...
@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
    Log.w("loader","onCreate");
    return new JSONLoader(this);
}


@Override
public void onLoadFinished(Loader<String> arg0, String arg1) {
        Log.w("loader","finish");

}

@Override
public void onLoaderReset(Loader<String> arg0) {
    Log.w("loader","onReset");
    // TODO Auto-generated method stub

}


public void useLoader() {

    Log.w("loader","useLoader");
      Bundle args = new Bundle();
      // ...
      // fill in args
      // ...


      Loader loader = 
         this.getLoaderManager().initLoader(0, args, this);

      Log.w("HashLoader",String.valueOf(loader.hashCode()));
      // with support library: 
      // Loader loader = 
      //    context2.getSupportLoaderManager().initLoader(0, args, this);
      // call forceLoad() to start processing
      loader.forceLoad();

   } 

ボタンのハング イベントが発生します。

btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            useLoader();
        }
    });

初めてボタンを押すと、ローダーの後に onLoadFinished() メソッドが呼び出されます。しかし、もう一度ボタンを押すと、最初の onLoadFinished() が呼び出されます。

ログキャット:

useLoader
onCreate
1087415440
good
finish
useLoader
finish
1087415440
good

AsyncTaskLoader について少し:

public class JSONLoader extends AsyncTaskLoader<String> {

public JSONLoader(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

@Override
public String loadInBackground() {
            try {
        Thread.sleep(5000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    Log.w("loader","good");
        return " ";}

メソッド onLoadFinished() がスレッドの終了を待たないのはなぜですか?

4

1 に答える 1

3

この関数は新しいローダーを破棄して作成initLoaderしないと思います。次に、2回目の実行で、カスタムローダーはすでに「ロード」されています=>呼び出しますonLoadFinish()

initLoader呼び出しを aに置き換えるだけで、それを破棄して再作成してみてくださいrestartLoader (参照)

Loader loader = this.getLoaderManager().restartLoader(0, args, this);
于 2013-03-18T20:05:56.377 に答える