0

2台のローダーがあります。まず、私のDBにSMSを読み込みます。もう1つは私のDBからカーソルアダプタにSMSを読み込みます。私のリストビューは、すべてのSMSが自分のDBに挿入された後にのみ更新されます。 'はonLoadFinishedすべてのSMSがロードされた後にのみListViewが更新されます

@Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     switch (id) { 
      case SMS_LOADER: { 
       String[] projection = { 
         BaseColumns._ID, 
         Telephony.TextBasedSmsColumns.DATE_SENT, 
         Telephony.TextBasedSmsColumns.BODY 
       }; 

       return new CursorLoader(this, 
         BASE_CONTENT_URI, 
         projection, 
         null, 
         null, 
         null); 
      } 
      case MY_DB_LOADER: { 
       String[] projection = { 
         MyEntry._ID, 
         MyEntry.COLUMN_1, 
         MyEntry.COLUMN_2 
       }; 

       return new CursorLoader(this, 
         MyEntry.CONTENT_URI, 
         projection, 
         null, 
         null, 
         null); 
      } 
      default: 
       Log.e(LOG_TAG, "Unsupported id " + id); 
       return null; 
     } 
    } 

私は:2つのローダーとここ

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
... 
     ListView listView = (ListView) findViewById(R.id.list); 
     mAdapter = new MyCursorAdapter(this, null); 
     listView.setAdapter(mAdapter); 
... 
     getSupportLoaderManager().initLoader(SMS_LOADER, null, this); 
     getSupportLoaderManager().initLoader(MY_DB_LOADER, null, this); 
    } 

あるonCreateLoaderonCreateでS' ここで

... 
    private static final int SMS_LOADER = 0; 
    private static final int MY_DB_LOADER = 1; 
    MyCursorAdapter mAdapter; 
... 

initLoader次のとおりです。ここで

はローダーとアダプタですSMSカーソルを通過し、私のDBに挿入:

@Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     int id = loader.getId(); 
     switch (id) { 
      case SMS_LOADER: 
       while (data.moveToNext()) { 
        int columnIndexDateSent = data.getColumnIndex(Telephony.TextBasedSmsColumns.DATE_SENT); 
        int columnIndexBody = data.getColumnIndex(Telephony.TextBasedSmsColumns.BODY); 

        String date = data.getString(columnIndexDateSent); 
        String body = data.getString(columnIndexBody); 

        ContentValues values = new ContentValues(); 

        values.put(MyEntry.COLUMN_1, date); 
        values.put(MyEntry.COLUMN_2, body); 

        getContentResolver().insert(MyEntry.CONTENT_URI, values); 
       } 
       break; 
      case MY_DB_LOADER: 
       mAdapter.swapCursor(data); 
       break; 
      default: 
       Log.e(LOG_TAG, "Unsupported id " + id); 
     } 
    } 

は、私はそれが挿入を作るために適切な場所ではないと思い、Androidのメーカーは言い続ける原因:

は、アプリケーションがそのメインスレッド上であまりにも多くの仕事をやっていてもよいです。

これらの挿入部分はどこに移動しますか? DBに最初の行を挿入した後にlistViewを更新する方法は?

答えて

0

これを解決しました。新しいクラスFillDB extends AsyncTaskを作成し、DBをdoInBackgroundに埋め込み、new FillDB().execute(data);onLoadFinishedとしたコードを移動しました。

関連する問題