私は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として渡すことができれば、引用された解が適用可能です。そうでなければ、この質問は重複しません。
感謝を参照してください。しかし、カーソルはパフォーマンスの問題ではなく、cur.getCount()の後に結果を返してほぼ即座に戻ります。ループ:while(cur.moveToNext())は:( – Gruiberg