安卓异步任务和AsyncTask

3

嗨,我的应用程序中有一个AsyncTask在OnCreate()中被调用,它从Web检索一些数据,并在下载时显示一个不确定进度条。

问题是当我启动应用程序时,屏幕会保持空白,直到AsyncTask完成。 代码大致如下。

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    loadData();
    //Several UI Code   
    startAsyncTasks();
}


 private void startAsyncTasks(){
    new ConnectingTask().execute();
 }

那么,如果你注释掉 startAsyncTasks() 这一行,UI 显示会更快吗? - Reuben Scratton
2
把你的AsyncTask代码贴出来可能是值得的,因为问题可能就出在那里。 - David Webb
请确保所有网络相关(耗时)的操作都在ConnectingTask.doInBackground()中完成。这样做可以保证主UI线程在繁重任务期间不会被阻塞,从而能够正常显示活动的UI元素。 - Vit Khudenko
1个回答

1

OnCreate()方法在Activity显示在屏幕上之前执行,因此整个数据下载过程在显示活动之前执行。

解决方案可以是在OnStart()方法中启动AsyncTask,而不是在OnCreate()方法中启动(同样被覆盖)。当Activity即将显示在屏幕上时,OnStart()方法被执行(参见Activity生命周期)。

这是我在我的应用程序中实现的情况,它可以正常工作。您应该在OnStart()方法中显示进度对话框,并在适当的时候通过AsyncTask进行更新和解除。

这是我的应用程序中的情况:

  1. AsyncTask在显示对话框框时开始在Activity OnStart()方法中启动
  2. 数据正在内部类中扩展AsyncTask中下载
  3. 数据下载完成后,对话框框被解除,初始化进一步数据处理(OnPostExecute())

缺点可能是OnStart()方法在第一次调用Activity时被调用,但也在恢复之后(例如在最小化应用程序之后)被调用。因此,AsyncTask可以多次执行,与OnCreate()方法相反,当创建Activity(而不是在恢复时)时仅调用一次。

如果您使用AsyncTask在jUnit测试中进行带有对话框的Activity,则还可能会出现一些问题-如果您这样做,请告诉我-我将发布一些解决方案


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