在Activity显示后执行AsyncTask

3
我正在开发一个Android 3.1应用程序。
我想在活动显示后执行AsyncTask。在执行AsyncTask之前,我想向用户展示一些内容。
我已经阅读到不推荐在onCreate()中执行AsyncTask
我应该在onStart()onResume()中执行AsyncTask
我希望在执行AsyncTask之前留出足够的时间来显示活动界面。

@user370305 噢,抱歉。我读到过不建议在onCreate()上运行AsyncTask的内容。 - VansFannel
在视图绘制到屏幕上后,onStart() 不会 被调用。 - Graeme
这不是真的。在那个阶段,屏幕上没有渲染任何视图。此时的视图只是被填充并附加到“Activity”根视图上。setContentView() - Graeme
屏幕在 onResume() 之后被渲染。尝试在 onCreate()onStart()onResume() 上放置调试点并观察您的设备。您会发现屏幕直到 onResume() 之后才被渲染。 - Graeme
@Graeme - onStart() 当活动开始对用户可见时调用。如果活动进入前台,则接下来调用onResume(),如果它变为隐藏状态,则调用onStop()。这意味着您所有的充气视图都正在渲染,并且现在正在向用户显示。 - user370305
显示剩余3条评论
4个回答

11

onCreate()onStart()onResume() 是由操作系统调用的生命周期方法,不应该直接调用。但是,您可以重写它们,在活动生命周期的这些阶段执行您的代码:

enter image description here

如果想要在所有 View 被填充和绘制到屏幕后再启动您的 AsyncTask,那么您需要将代码放在以下位置中:

    toReturn.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        public void onGlobalLayout() {
            toReturn.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            // asyncTask.execute();
        }
    });
在上面的示例中,toReturn 是在您的 onCreate() 方法中的一个视图。它可以是任何你喜欢的视图。 该代码从视图中提取一个 ViewTreeObserver 并向其中添加一个监听器,当视图完成绘制到屏幕时将调用它。重要的是要保留 "removeGlobalOnLayoutListener()`" 行,这将防止代码在每次绘制视图时都触发。

1
祝福你!我一直遇到类似的问题,某个命令无法从“OnCreate()”或“OnResume()”中运行,因为接口尚未加载,因此各种方法返回 null,这解决了它(甚至不使用异步任务!)谢谢! - Elad Avron

1

答案在onResume()中。

我在我的活动中有同样的要求,需要显示一些列表和其他按钮和图像。由于列表从服务器获取数据,因此使用了AsyncTask。

但是,在此之前需要显示空的listview和屏幕的其他部分。

所以,当它首先进入onCreate()时,我将空数组列表设置为listview的适配器,然后在onResume()中调用Asynctask,在该任务中填充ArrayList并调用adapter.notifyDataSetChanged()

然后又出现了另一个问题...当我进入下一个活动并返回时,即使我不需要,它也总是调用asynctask。

因此,我加了一些条件,如if(arrayList.size()==0),则调用asynctask,否则不调用。


0

你可以将代码放在onWindowsFocusChanged方法中。你可以在其中使用一个线程来管理计时器,以启动你的特定异步任务。 请注意,这将在每次你的活动获得焦点时执行,而不仅仅是在你首次启动活动时(我不知道这是否会对你造成问题)。


你的代码会不会在每次 toast 或对话框获得焦点或每次从后台恢复活动时被触发? - Graeme
1
确实如此。这个问题没有足够详细的描述,但我已经强调了每次活动获得焦点时都可能触发它。如果这是一个问题,我的方法应该被舍弃。我已经成功地使用它来启动/恢复背景音乐。 - Zappescu
好的使用示例! :) - Graeme

-2
实现一个View对象并重写onDraw()方法。
这样你就可以确切地知道第一个屏幕何时对用户可见了。

这将意味着创建一个自定义视图(或匿名自定义视图),并在onDraw()方法中添加与其无关的代码。请参见我的答案,了解一种(丑陋但)更好的在View绘制后执行代码的方法。 - Graeme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接