活动不显示,直到Asynctask完成



我正在启动一个活动,并在onCreateView()中调用asynctask从webservice中获取数据,并在onPostExecute()中填充数据。当前,直到fragment中的asynctask完成,activity才会加载。

如何立即显示空表单并在任务完成时更新它?活动只承载片段,异步任务在片段中,如果这有区别的话。

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

这是因为您正在填充数据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();
    }
}

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

下面是一个例子(用这个代替getFriends()):

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

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新