我正在尝试使用ListView
从数据库获取数据后填充AsyncTask
。在ListView
获取数据后,我通过onPostExecute
方法填充AsyncTask
,但即使数据库返回数据,也不会填充ListView
。
调用数据:
private void RefreshNewsFeed() {
new NewsfeedTask().execute();
}
的AsyncTask:
private class NewsfeedTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
try {
final MobileServiceList<ActivityTable> result = activitiesTable.execute().get();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (!(result.isEmpty())) {
for (ActivityTable item : result) {
final ActivityTable activity = new ActivityTable();
activity.setID(item.getId());
activity.setContent(item.getContent());
activity.setUserID(item.getUserID());
activity.setMedia(item.getMedia());
activity.setType((item.getType()));
Log.d("CHECK", activity.getType());
UserTable user = GetUser(item.getUserID());
activity.setUser(user);
activities.add(activity);
//activities is a globally declared List
}
} else {
Log.e("CHECK", "Error in Activity Loading 1");
}
}
});
} catch (Exception exception) {
Log.e("CHECK", "Error in Activity Loading 2");
Log.e("CHECK", exception.toString());
}
return null;
}
protected void onPostExecute() {
//Populate ListView after the AsyncTask returns values
ListView newsreel = (ListView) getActivity().findViewById(R.id.newsreel_list);
NewsfeedAdapter adapter = new NewsfeedAdapter(getActivity(),R.layout.activity_newsfeed,activities);
newsreel.setAdapter(adapter);
}
}
但是,ListView
没有填充。列表不是空的,我查了一下。我做错了什么?
答案 0 :(得分:1)
可能是因为你压倒了错误的功能。 onPostExecute(result)接受一个结果参数。改为:
onPostExecute(Void v)
修改强>
关于你的后续问题:doInBackground在工作线程上,它将结果返回到postexecute(..)
您通过调用run:
在主线程上设置活动 getActivity().runOnUiThread(new Runnable() {
@Override
public void run() { ..
您可能没有异步任务,因为所有操作都在主线程上完成。 doInBackground执行几个语句然后转到postExecute(设置listView)然后转到run()方法(设置活动)。让活动设置在工作线程上,即删除run()
答案 1 :(得分:1)
在AsyncTask方法之前添加@Override
。例如:
@Override
protected void onPostExecute() {..}
编辑:此外,您的onPostExecute()
方法接受一个参数,该参数将是您从doInBackground()
返回的对象。所以,添加这个
@Override
protected void onPostExecute(Void v)