0

実装時に問題がありますAsyncTask。最近の情報を取得するには、携帯電話を回転させる必要があります。以下は私のクラスです:

GamerObject gamer;
….

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      ip = "134.188.204.155";
      // Set the name of the gamer
      gamername = (TextView) findViewById(R.id.gamer_name);
      // Set the gamerstatus:
      gamerstatus = (TextView) findViewById(R.id.tvgamer_status_msg);
      // set the job status
      jobstatus = (TextView) findViewById(R.id.tvJob_status_msg);
      new Operation().execute();
 }

private class Operation extends AsyncTask<Void, Void, Void> {

     @Override
     protected Void doInBackground(Void... params) {
        gamer= new GamerObject(ip);
        gamer.UpdateAllData();
     }

    @Override
    protected void onPostExecute(Void result) {
       updateUI();
    }
}

private void updateUI() {
    gamer.updateAllData();
    // Set the name of the gamer
    TextView gamername = (TextView) findViewById(R.id.gamer_name );
    gamername.setText(gamer.gamername);
    gamername = gamer.gamername ;
    // Set the gamer status:
     …
    // set the job status
     …
}

AsyncTask以前はインターフェイスを更新するためにインテントを使用していましたが、Android バージョン 4 と互換性があるように 使用してみたいと思います。電話を回転させずに情報を更新する方法を知っている人はいますか?

編集:
私が間違っていなければ、新しい値がある場合に UI が更新されなかったのはnew Operation().execute(); 、onCreate で 1 回しか使用しないためです。onCreate が呼び出された場合、 AsyncTask が実行されます。つまり、電話を回転させるたびに onCreate に移動します。AsyncTask を実行し続ける方法を知っている人はいますか?

4

2 に答える 2

1

AsyncTask一度だけ実行されるため、何らかのライフサイクル イベントのためにシステムがアクティビティで onCreate を呼び出すたびに、asyncTask が実行されます。

シンプルだが素朴なアプローチの 1 つは、新しい を作成し、Threadそれを使用Handlerして UI を更新することです。いくつかの詳細情報を見つけることができます。ここともちろん Android docにあります。

より良いアプローチですが、より複雑なのは@meter が述べたようにLoaderandLoaderCallbackを使用することです。ContentProviderこれには、独自の実装が必要ContentProviderになり、アプリに「抽象化レイヤー」を追加する必要がありますが、ネットワーク ベース コードと UI コードを分離することができます。

したがって、スレッドを使用した「シンプル」だが醜いソリューションを使用するか、スレッドを使用した「より難しい」がエレガントなソリューションを使用するかは、常に難しい決定です。ContentProvier

于 2013-11-05T21:34:46.443 に答える
0

電話を回転させることなく、情報を自動的に更新したい。

これを行うには、さらに作業が必要です。残念ながら、Async タスクが実際に何をするかはわかりません。データベースからデータを読み取っていて、データベースへの変更について UI に通知したくない場合は、コンテンツ リゾルバーが notifyChange を呼び出し、アクティビティがこれらの変更をリッスンしてから、非同期タスクを再度呼び出すことができます。そのためには、Content Observerを使用します。ただし、タスクが Web からデータをダウンロードしている場合、オンラインでデータが変更された場合に通知を受ける方法は 2 つあります。1 つはポーリングと呼ばれ、定期的に接続してサーバーをチェックすることを意味します。バッテリー、パフォーマンス、およびデータ トラフィックの制限のため、モバイル デバイスでは絶対に実行しないでください。もう 1 つはプッシュと呼ばれ、いくつかのインフラストラクチャを設定する必要があります。

お役に立てば幸いです。

于 2013-11-05T11:01:19.797 に答える