我正在启动一个活动并在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") );
}
}
答案 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);
希望它有所帮助。