3

3つのスピナーを使用したアクティビティがあります。これらのスピナーは、完了するまでに約1分かかる方法でWebサービスからデータを取得します。

最初にアクティビティをロードし、それが表示されたら、その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がハングします。

バックグラウンド作業を行うための最良の解決策の1つは、AsyncTaskです。これを使用すると、onCreate()メソッドで呼び出すことができ、完了すると、データを表示できるUIスレッドへのコールバックが送信されます。

このアクティビティが表示されるたびにこのメソッドを実行する場合は、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 に答える