3

我有一个带有 3 个旋转器的活动。这些微调器通过大约需要 1 分钟才能完成的方法从 Web 服务获取数据。

我想先加载 Activity,在它可见后,调用该 Web 服务方法并加载数据。我已经分别测试了以下代码,但没有一个能解决我的问题。在这些示例中,应用程序进入黑屏,并且当 Web 服务操作完成时,它会变得可见。

@Override
protected void onCreate() {

    //.........    


    final Runnable r = new Runnable()
    {
        public void run()
        {
            loadMyData();
        }
    };
    Utilities.performOnBackgroundThread(r);    
}

@Override
protected void onResume() {

    new Thread() {
        @Override
        public void run() {
            loadMyData();
        }
    }.start();
    super.onResume();

}

@Override
protected void onStart() {
    if (comesFromOnCreateMethod)
    {
        final Runnable r = new Runnable()
        {
            public void run()
            {
                loadMyData();
            }
        };
        Utilities.performOnBackgroundThread(r);
    }
    comesFromOnCreateMethod = false;
    super.onStart();
}

@Override
protected void onResume() {

    if (comesFromOnCreateMethod)
    {
        final Runnable r = new Runnable()
        {
            public void run()
            {
                loadMyData();
            }
        };
        Utilities.performOnBackgroundThread(r);
    }
    comesFromOnCreateMethod = false;

}
4

4 回答 4

4

如果您遇到黑屏,那么我会假设您的代码正在 UI 线程上而不是在后台运行,导致 UI 挂起,直到工作完成。

进行后台工作的最佳解决方案之一是AsyncTask。使用它,你可以在你的 onCreate() 方法中调用它,当它完成时,它会为你发布一个回调到 UI 线程,你可以在其中显示你的数据。

如果您希望每次显示此 Activity 时都运行此方法,请在 onResume() 中调用它。否则,在 onCreate() 中调用它。

于 2012-04-02T08:47:36.127 回答
2

在您的 onCreate 中,按照其他人的建议进行异步任务。确保首先为应用程序生成内容,然后调用 asyncTasks。您可以通过回调控制您的微调器。

于 2012-04-02T08:56:13.980 回答
1

使用AssynchTask(),你应该打电话给超级。onResume()或相应生命周期方法中的任何生命周期方法,然后是您想要执行的其他特定方法....

于 2012-04-02T09:25:54.917 回答
1

首先,你可能想提高你的接受率,39% 相当低。

无论如何,你可能想检查 AsyncTask,它应该做的事情。http://developer.android.com/reference/android/os/AsyncTask.html

通常,您需要在 onPreExecute 中进行初始化,在 doInBackGround 中进行网络连接,并将结果设置到 OnPostExecute 上的 UI 线程。希望这会有所帮助。

于 2012-04-02T08:49:20.327 回答