在异步任务完成之前,活动不会显示

时间:2014-03-20 20:56:12

标签: android android-fragments android-asynctask

我正在启动一个活动并在onCreateView()中调用asynctask来从webservice获取数据并在onPostExecute()中填充数据。目前,在片段中的asynctask完成之前,活动才会加载。

如何立即显示空表单并在任务完成时更新它?活动只是托管片段,而asyntasks在片段中,如果这会产生影响。

片段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") );

    }
}

2 个答案:

答案 0 :(得分: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 :(得分:0)

您应该在Activity的onCreate()方法中尽可能少地完成任务。请注意,您的表单只会在onCreate()完全&#39;之后绘制。执行。 一个好主意是从一个有一点延迟(50 - 100 ms)的计时器开始你的耗时任务,以确保你的onCreate()方法完成执行。

以下是一个示例(将其替换为getFriends()):

Handler getFriendsDelayed = new Handler(); 
getFriendsDelayed.postDelayed(new Runnable()
{ 
    public void run()
    {
        getFriends();
    }
}, DELAY_IN_MILLISEC);

希望它有所帮助。