2

ここで質問するのは初めてなので、それについてのアドバイスをいただければ幸いです...しかし、私の問題には:

サーバーからのデータを表示するアクティビティから別のアクティビティに切り替えようとしています。AsyncTask を介してサーバーからデータを取得していますが、ダウンロードが長くなると、アクティビティの間に黒い画面が表示されます。私はすでに AsyncTask を onCreate() から onStart() に入れようとしましたが、そこに変更はありません。

新しいアクティビティ:

public class SalesMenu extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.sales_menu);        
    setProgressBarIndeterminateVisibility(true);
    super.onCreate(savedInstanceState);
}

@Override
protected void onStart() {
    List<HashMap<String, Object>> result = null;
    AsyncTask<Void, Boolean, List<HashMap<String, Object>>> aTask = new AsyncSearchRead(
            "sale.order", 
            new Object[0], 
            new String[] {"name"}, 
            this).execute();

    try {
        result = aTask.get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    Log.d("test", (result!=null ? result.toString() : "nothing"));
    super.onStart();
}

}

私の非同期タスク:

public class AsyncSearchRead extends AsyncTask<Void, Boolean, List<HashMap<String, Object>>> {
String mModel; 
boolean mCount; 
Integer mOffset;
Integer mLimit; 
String mOrder; 
boolean mReverseOrder; 
Object[] mConditions;
String[] mFields;
Activity parentActivity;

public AsyncSearchRead(String model, boolean count, Integer offset, Integer limit, 
                    String order, boolean reverseOrder, Object[] conditions, String[] fields,
                    Activity activity) {
    mModel = model;
    mCount = count;
    mOffset = offset;
    mLimit = limit;
    mOrder = order;
    mReverseOrder = reverseOrder;
    mConditions = conditions;
    mFields = fields;
    parentActivity = activity;
}

@Override
protected List<HashMap<String, Object>> doInBackground(Void... params) {
    Long[] ids;
    List<HashMap<String, Object>> results;
            //Downloading the data
    ids = SetServer.connection.search(mModel, mCount, mOffset, mLimit, mOrder, mReverseOrder, mConditions);
    results = SetServer.connection.read(mModel, ids, mFields);

    return results;
}

@Override
protected void onPostExecute(List<HashMap<String, Object>> result) {
    parentActivity.setProgressBarIndeterminateVisibility(false);
}

}

onPostExecute の可視性をオフにしなかった場合、アクティビティを表示した後も回転し続けましたが、ロード後にのみ表示されます。

アクティビティを表示し、その後にデータのロードを開始して進行状況バー/ローダーを表示するにはどうすればよいですか?

助けてくれてありがとう。

4

4 に答える 4

9

を使用しているためです.get().get()基本的にAsyncTask同期を行います(メインスレッドを完了するまで待機させます)ので、基本的にはまったく実行しないようなものAsyncTaskです。

私の提案は次のとおりです。

  1. List<HashMap<String, Object>> result = null;メンバー変数になるように移動します。
  2. try/catchステートメント全体(その.get()中にあるもの)とへの呼び出しを削除しLog.*ます。
  3. AsyncTaskの内部クラスになるように移動しますSalesMenu
  4. で行うだけthis.result = resultonPostExecute()なく、他の処理を行う必要があります。
于 2013-03-06T22:48:39.800 に答える
2

非常に良いアドバイス(+1)である@Ericの答えに加えて、super.onCreate()前に置いてみてくださいsetContentView()。原則として、スーパー コールはオーバーライドされた Android ライフサイクル メソッドで何よりも先に発生する必要があり、これら 2 つのメソッドの場合は特に重要です。

于 2013-03-06T22:49:58.310 に答える
0

他の優れた答えに加えて。

doInBackground()メソッドでは、進行状況を表示するためにpublichProgress()定期的に呼び出します。これにより、が呼び出されますonProgressUpdate()。が戻った後にonPostExecute()のみ呼び出されます。 doInBackground()

AsyncTaskドキュメントに完全な使用例があります。

于 2013-03-06T22:52:55.337 に答える