如何通过 AsyncTask 类或新线程进行游标查询? [复制]
Posted
技术标签:
【中文标题】如何通过 AsyncTask 类或新线程进行游标查询? [复制]【英文标题】:How to do Cursor query through AsyncTask class, or new Thread? [duplicate] 【发布时间】:2017-06-18 11:42:08 【问题描述】:我是 android 新手,很难在不冻结 UI 的情况下实现以下代码。我尝试使用一个新线程,但是当循环完成时它没有给出反馈(至少我不知道如何得到它)。我的代码如下所示(摘录):
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 函数中将字符串数组作为参数传递,则引用的解决方案适用,否则此问题不重复。
【问题讨论】:
【参考方案1】:您可以使用CursorLoader
来实现它,它负责异步加载数据
参考这个https://developer.android.com/reference/android/content/CursorLoader.html
http://www.theappguruz.com/blog/use-android-cursorloader-example
【讨论】:
感谢您的建议。但是,游标不是性能问题,它在 cur.getCount() 之后几乎立即返回结果。循环:while (cur.moveToNext()) is :(以上是关于如何通过 AsyncTask 类或新线程进行游标查询? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
用 Asynctask 更新 FragmentTransaction 替换的片段
对于 MySQL 请求,是不是有比 ASyncTask 更好的类或库? [关闭]