我正在开发Android 3.1应用程序。
我希望在显示活动后执行AsyncTask
。我想在执行AsyncTask
之前向用户展示一些内容。
我读过我不建议在AsyncTask
上执行onCreate()
。
我必须在AsyncTask
或onStart()
执行onResume()
吗?
我希望在执行之前留出足够的时间来展示活动。
答案 0 :(得分:10)
onCreate()
,onStart()
和onResume()
是操作系统调用的生命周期方法,不应直接调用。但是,您可以覆盖它们,以便在活动生命周期的这些阶段执行代码:
但是,如果您希望在所有View
被夸大并绘制到屏幕之后启动AsyncTask,那么您需要将代码放入此中:
toReturn.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
toReturn.getViewTreeObserver().removeGlobalOnLayoutListener(this);
// asyncTask.execute();
}
});
在上面的示例中,toReturn
是onCreate()方法中的视图。它可以是你喜欢的任何视图。
从视图中提取ViewTreeObserver
并添加一个侦听器,当视图完成绘制到屏幕时将调用该侦听器。保持“removeGlobalOnLayoutListener()”行是很重要的,因为这将阻止代码触发每次时间绘制视图。
答案 1 :(得分:1)
答案在onResume()
我在我的活动中有同样的要求,我需要用其他按钮和图像显示一些列表。 列表从服务器获取数据,因此使用AsyncTask ...
但在此之前需要显示空列表视图和屏幕的其他部分..
首先,当它转到onCreate()
时,我将empty arraylist
设置为listview的适配器,然后在onResume()
中调用Asynctask并在该任务中填充ArrayList并调用adapter.notifyDataSetChanged()
然后又出现了另一个问题......当我进入下一个活动并回来时,即使我不需要它也总是调用asynctask ...
所以放了一些像if(arrayList.size()==0)
这样的条件,然后调用asynctask else
。
答案 2 :(得分:0)
您可以将yur代码放在onWindowsFocusChanged方法中。您可以使用其中的线程来管理计时器以启动您的特定异步任务。 请注意,每次您的活动都有焦点时都会执行此操作,而不仅仅是您第一次启动活动时(我不知道这对您来说是否有问题)。
答案 3 :(得分:-2)
实施View
对象并覆盖onDraw()
这样你就可以确切地知道用户可以看到第一个屏幕的时间