Android Async onPostExecute不会被触发

时间:2015-05-21 16:53:20

标签: android listview android-asynctask

我正在尝试使用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没有填充。列表不是空的,我查了一下。我做错了什么?

2 个答案:

答案 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)