2012-12-31 105 views
3

从AsyncTaskActivity onPostExecute()方法内部调用setadapter()方法时出现问题。我已阅读关于AsyncTask的文档:http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result),但没有找到答案如何实现这一目标。我应该使用意图来做到这一点吗?我是Android新手,所以请原谅我,如果这是一个愚蠢的问题。从AsyncTask调用UI线程方法

MainActivity

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); 
    } 
} 

AsyncTaskActivity

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 

    } 

} 

回答

5

假设你的AsyncTask总是被MainActivity调用,这样做

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

您可以为setAdapter方法指定更多的参数,所以你可以传递CursorString阵列等

但是一个更好的方法,如果AsyncTask只从MainActivity称为是让这个AsyncTaskMainActivity私有内部类。这将允许它访问所有的全局变量和MainActivity

+0

的AsyncTask作为在MainActivity内的内部类对我的作品,但上面的代码不会(我setadapter()方法无法访问) 。 – Kristopher

+0

@soulreaver这可能是因为我忘记宣布mAA作为MainActivity的参考。如果你只是做了Activity,它就不会看到这个方法,因为Activity没有setAdapter()方法,而MainActivity没有。 –

0

方法你的做法是有点不寻常,但回答问的问题:

变化activity到ListActivity:

ListActivity activity = null; 

而且使用方法:

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

你笑uld使用LoaderManager类进行研究,它会为您创建并处理后台线程。您还应该考虑使用ContentProvider,它也会为您处理大量忙碌的工作。

最后AsyncTaskActivity不是一个活动,所以这个类的名字是有点混乱......

+0

我知道LoaderManager和内容提供者,但他们似乎对于初学者(我是)太复杂了,除了这个解决方案似乎是简单应用程序的代码覆盖。 – Kristopher

相关问题