异步任务完成前Activity不显示

3
我在onCreateView()中启动一个活动并调用asynctask从webservice获取数据,在onPostExecute()中填充数据。目前,直到片段中的asynctask完成后,该活动才能加载。
如何立即显示空表单并在任务完成时更新它?该活动只是托管片段,如果这有区别,异步任务在片段中。
片段onCreateView():
    @Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_friends,container, false);




    return v;

}

onActivityCreated() 片段:

    @Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);

    //getFriends() calls a method that is an asyntask
    peopleList = getFriends();

    if (peopleList!=null){
    list = (ListView)getActivity().findViewById( R.id.friendsList);

    list.setAdapter(new FriendsAdapter(getActivity(), peopleList,"friends") );

    }
}

你能展示一下如何调用异步任务吗?难道你不能在onViewCreated(片段创建后)中启动异步任务吗? - peshkira
//getFriends() 调用了一个方法,其本身是 AsyncTask。一个方法怎么可能成为 AsyncTask 呢?你把我搞糊涂了。 - donfuxx
2个回答

1
这是因为您正在 onPostExecute() 中填充数据,该方法仅在 doInBackground() 完成后连接到 UI 线程。如果您想显示进度,需要调用 publishProgress() 方法。
现在,publishProgress() 方法连接到 onProgressUpdate() 方法,该方法连接到更新 UI 线程,而 doInBackground() 正在运行时更新 UI 线程。我曾经为练习做过一个非常简单的示例 - 看看它如何工作。它基本上每次更新 ListActivity 的一个元素,并在屏幕上显示此进度 - 它不会等待所有字符串都添加后才显示最终页面。
class AddStringTask extends AsyncTask<Void, String, Void> {


    @Override
    protected Void doInBackground(Void... params) {
        for(String item : items) {
            publishProgress(item);
            SystemClock.sleep(400);
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(String... item) {
        adapter.add(items[0]);
    }

    @Override
    protected void onPostExecute(Void unused) {
        Toast.makeText(getActivity(), "Done adding string item", Toast.LENGTH_SHORT).show();
    }

}

1
事实证明,我的真正问题是在很久以前的午夜编码会话中,我创建了一个被称为Task.get()的集中式异步任务,并从各个地方调用它...像个白痴一样。 我接受了这个答案,因为它提供了很好的信息,并且针对我实际描述的问题,对于任何寻找解决方案的人来说都是有效的答案。 - TheGeekNess

0
你应该尽可能地减少在Activity的onCreate()方法中耗费时间的任务。请注意,只有在onCreate()完全执行后,您的表单才会被绘制出来。
一个好主意是从计时器开始一个稍微延迟一点(50-100毫秒)的耗时任务,以确保您的onCreate()方法已经完成执行。
这里是一个例子(将其放在getFriends()的位置):
Handler getFriendsDelayed = new Handler(); 
getFriendsDelayed.postDelayed(new Runnable()
{ 
    public void run()
    {
        getFriends();
    }
}, DELAY_IN_MILLISEC);

希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接