2017-02-01 11 views
0

私はAndroidには新しく、UIフリーズなしで次のコードを実装するのは難しいです。私は新しいスレッドを使用しようとしましたが、ループが終了したときにフィードバックを出すことはできません(少なくとも私はそれを取得する方法はわかりません)。私のコードは次のようになっています(抜粋):どのようにAsyncTaskクラスまたは新しいスレッドを介してカーソルクエリ?

public class FilterSettingsActivity extends AppCompatActivity { 
private String SMSMsgs = ""; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_filter_settings); 
    listSMSs(false); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
     case R.id.action_preview: 

      listSMSs(true); 

      //execute after loop completetion 
      Intent i = new Intent(FilterSettingsActivity.this, PreviewSmsActivity.class); 
      i.putExtra("SMSMsgs",SMSMsgs); 
      startActivity(i); 
      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

public void listSMSs(Boolean write){ 

    Cursor cur = getContentResolver().query(uriSMS, null, getSelection(fromDate,toDate,thread_id),getArgs(fromDate,toDate,thread_id),"thread_id"); 
    String sms = cur.getCount()+" SMS found"; 

    if(write==true) { 

     // this code stucks UI 
     while (cur.moveToNext()) { 
      Long d = Long.parseLong(cur.getString(cur.getColumnIndex("date"))); //for retrieve readable date, time 
      String PhoneNumber = cur.getString(cur.getColumnIndex("address")); 

      SMSMsgs += "At :"+ millisToDate(d) +" From :" + getContactName(FilterSettingsActivity.this,PhoneNumber)+" "+ cur.getString(cur.getColumnIndex("address"))+" : " + "\n" 
        + cur.getString(cur.getColumnIndex("body"))+"\n"+"\n"; 
     } 
    } 
    final TextView textView = (TextView) findViewById(R.id.tvStatus); 
    textView.setText(sms); 
    } 

} 

誰でも、AsyncTaskまたはCursorの新しいスレッドを実装する方法を教えてください。ありがとうございました。

編集:ここでの問題は、カーソルがasynctaskクラスの中になければならず、その機能を実行するために外部の関数やアクティビティからいくつかの引数(文字列、文字列)を受け取らなければならないということです。これらの関数とアクティビティは、コード例には記載されていません。文字列の配列をdoInBackground関数のparamsとして渡すことができれば、引用された解が適用可能です。そうでなければ、この質問は重複しません。

答えて

0

あなたはロードデータの世話をされ、これを実装するCursorLoaderを使用することができますが、非同期

は提案のために、このhttps://developer.android.com/reference/android/content/CursorLoader.html

http://www.theappguruz.com/blog/use-android-cursorloader-example

+0

感謝を参照してください。しかし、カーソルはパフォーマンスの問題ではなく、cur.getCount()の後に結果を返してほぼ即座に戻ります。ループ:while(cur.moveToNext())は:( – Gruiberg

関連する問題