我正在启动一个活动,并在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);
希望能有所帮助。