3

我在从 AsyncTaskActivity onPostExecute() 方法内部调用 setadapter() 方法时遇到问题。我已经阅读了有关 AsyncTask 的文档:http: //developer.android.com/reference/android/os/AsyncTask.html#onPostExecute (Result ) 但没有找到如何实现的答案。我应该使用 Intent 这样做吗?我是 Android 开发的新手,所以如果这是一个愚蠢的问题,请原谅我。

主要活动

public class MainActivity extends ListActivity {

private String[] columns = new String[] {"foreign_word", "native_word"};
private int[] target = new int[] { R.id.foreign_word, R.id.native_word };
private Cursor cur = null;

 @Override
 protected void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);

     new AsyncTaskActivity(this).execute();
 }

    public void setadapter(Cursor cur)  {
        SimpleCursorAdapter aaa = new SimpleCursorAdapter(this.getApplicationContext(), R.layout.list_entry, cur, columns, target, 0);
        this.setListAdapter(aaa);
    }
}

异步任务活动

public class AsyncTaskActivity extends AsyncTask<Void, Void, Cursor> {

Activity activity = null;
private SQLiteDatabase db = null;
private String[] selection = {"_id", "native_word", "foreign_word"};
Cursor cur = null;


public AsyncTaskActivity(Activity activity) {
    this.activity = activity;
}

@Override
protected Cursor doInBackground(Void... params) {
    DbAdapter mSQLadapter = new DbAdapter(activity);
    db = mSQLadapter.getWritableDatabase();
    Cursor cur = db.query("words", selection, "foreign_word='car'", null, null, null, null);
    return cur;
}

protected void onPostExecute(Cursor cur) {

// I'd like to call setadapter() ,passing it Cursor as a parameter

   }

}
4

2 回答 2

5

假设您的 AsyncTask 始终由 调用MainActivity,请执行此操作

protected void onPostExecute(Cursor cur) {
   MainActivity mActivity = (MainActivity) activity;
   mActivity.setadapter();
   }

您可以为您的方法指定更多参数,setAdapter以便您可以传递CursorStringArray 等。

AsyncTask但是,如果仅调用 from ,则更好的方法MainActivity是将其AsyncTask设置为内部的私有内部类MainActivity。这将允许它访问所有全局变量和方法MainActivity

于 2012-12-31T22:13:51.897 回答
0

您的方法有点不寻常,但要回答所提出的问题:

更改activity为 ListActivity:

ListActivity activity = null;

并使用:

protected void onPostExecute(Cursor cur) {
    activity.setListAdapter(new SimpleCursorAdapter(activity, R.layout.list_entry, cur, columns, target, 0));
}

您应该考虑使用 LoaderManager 类,它会为您创建和处理后台线程。您还应该考虑使用 ContentProvider,它也会为您处理很多繁忙的工作。

最后 AsyncTaskActivity 不是一个 Activity,所以这个类名有点混乱......

于 2012-12-31T22:14:39.060 回答