2012-04-11 9 views
6

CursorLoaderを使用してウィジェットを画面に埋め込む方法を知りたい。すべてのオンラインの例は、アダプタを使用するためだけであり、これは素晴らしいです。私が必要とするのは、画面内のビューをカーソルとUIスレッド上で更新する信頼できる方法です。StaleDataExceptionまたはカーソルが突然すべて非アクティブになるために時々クラッシュすることはありません。ここに私の現在のアプローチがありますが、私はまだユーザーからいくつかのクラッシュレポートを受け取ります。onLoadFinished()内のカーソルからウィジェットを取り込む

@Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) { 
     CursorLoader loader = null; 

     switch (id) { 
      case LOADER_ID_DATA: 
       loader = new CursorLoader(...); 
       break; 
     } 

     return loader; 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, final Cursor cursor) { 
     handler.post(new Runnable() { 

      @Override 
      public void run() { 
       if (getActivity() == null) 
        return; 

       updateView(cursor); 
      } 
     }); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
    } 

一つの解決策は、onLoadFinished内に直接、すべてのカーソルのフィールドを取得し、UIスレッド上でウィジェットを移入するハンドラにそれらをすべて渡すことであろう。しかし、これは私がカーソルに多くの値を持つ可能性があるため、醜いです。私はこのすべてを扱う信頼性の高いクラッシュフリーな方法を見つけることが大好きです。

+0

"onLoadFinished内のすべてのカーソルフィールドを直接取得し、それらをすべてハンドラに渡してUIスレッドにウィジェットを設定することです。" - onLoadFinished()はメインアプリケーションスレッドで呼び出されます。 – CommonsWare

+0

@CommonsWare私の知る限り、onLoadFinishedはメインのUIスレッドでは呼び出されません。 Reto Meierによって書かれたandroid-protips_locationのソースコードを見てみると、彼はハンドラを使ってウィジェットに値を入力します。 onLoadFinished()の上の彼のコメントは、彼がメインアプリケーションスレッドの更新をスケジュールすることです。 –

+0

Reto Meierからの引用:「onLoadFinishedはメインのアプリケーションスレッドと同期していないので、Cursorがロードされたときと同じスレッドでCursor値を抽出してから、新しいRunnableをUIスレッドにポストする値をUI要素に返す " –

答えて

7

#android-dev SimonVTreadmeで質問したところ、私はこれの底を知るのを助けました。

onLoadFinishedがUIスレッドで呼び出されるということは何もないので、理論的にはRetoの本でアドバイスされたようなHandlerを使用するべきです。しかし、CursorLoader(これは最も一般的な使用例です)を使用すると、onLoadFinishedがUIスレッドで呼び出されることがほぼ保証されます。

+3

「かなり多く」の理由は、CursorLoaderがAsyncTaskを使用してバックグラウンド処理を行い、スタティックハンドラを使用してポストバックし、最終的にonLoadFinishedを呼び出すためです。メインスレッドからLoaderManager.initLoader(...)を呼び出すと、ハンドラはメインスレッドにも確実にアタッチされます。このハンドラがメインスレッドにアタッチされないようにするには、ルーパーを使用してスレッドを作成し、そこからローダーを起動する必要があります。 – SimonVT

関連する問題