如何通过 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 替换的片段

Android开发--取消AsyncTask

AsyncTask的用法

对于 MySQL 请求,是不是有比 ASyncTask 更好的类或库? [关闭]

安卓Android开发:使用Executor线程池代替AsyncTask进行异步操作

安卓Android开发:使用Executor线程池代替AsyncTask进行异步操作