3

私は比較的新しい Android 開発者で、RESTful Web サービスを多数呼び出すアプリケーションに取り組んでいます。

私は各呼び出しを作成してasyncTaskいますが、一部のファイルでは、さまざまな非同期タスクの量が 15 に近づいています。現在、それらはすべてアクティビティ クラス内のプライベート クラスとして持っています。UIを更新しながら、どうすればそれらをより良く整理できますか(つまり、別々のファイルに入れることができますか)..contextそれぞれのコンストラクターに渡すことを考えていましasyncTaskたが、ベストプラクティス/より良い方法があるかどうか疑問に思っていました.

ありがとう!

4

3 に答える 3

1

ライブラリを使用してコード ベースを簡素化することを検討してください。私はdroidQueryを書きました。これはとりわけ、AsyncTasks を単純化するために使用できます。たとえば、 からJSONデータを取得しexample.com、後でコンテキストにアクセスするには、次のようにします。

$.ajax(new AjaxOptions().url("http://www.example.com")
                        .context(this)
                        .type("GET")
                        .dataType("json")
                        .success(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                JSONObject json = (JSONObject) params[0];
                                Context context = droidQuery.context();
                                //TODO:
                            }
                        })
                        .error(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                AjaxError error = (AjaxError) params[0];
                                Log.e("Ajax", "Error " + error.status + ": " + error.reason);
                            }
                        }));

頻繁に呼び出すさまざまなリクエストの場合、AjaxOptions後で使用するために、さまざまな URL、タイプ、データ型などを持つのインスタンスを作成することもできます。

Map<String, AjaxOptions> requests = new HashMap<String, AjaxOptions>();
//add the example above:
requests.put("example", new AjaxOptions().url("http://www.example.com")
                                         .context(this)
                                         .type("GET")
                                         .dataType("json")
                                         .success(new Function() {
                                             @Override
                                             public void invoke($ droidQuery, Object... params) {
                                                 JSONObject json = (JSONObject) params[0];
                                                 Context context = droidQuery.context();
                                                 //TODO:
                                             }
                                         })
                                         .error(new Function() {
                                             @Override
                                             public void invoke($ droidQuery, Object... params) {
                                                 AjaxError error = (AjaxError) params[0];
                                                 Log.e("Ajax", "Error " + error.status + ": " + error.reason);
                                             }
                                         }));

その後、次のように呼び出してこのタスクを実行します。

$.ajax(requests.get("example"));
于 2013-08-21T16:27:35.973 に答える
1

Activity をコンストラクター パラメーターとして渡すことは、私にとっては良い計画のように思えます。基本的に、それらを内部クラスとして宣言すると同じことが起こります。

ただし、AsyncTasks を使用してデータをロードすることにはいくつかの欠点があることに注意してください。開始すると、アクティビティが既に閉じられていても実行され続け、アクティビティへの参照が保持されます (したがって、ガベージ コレクションはできません)。

ローダーのような他の概念を調べたいと思うかもしれません。

于 2013-08-21T16:11:14.447 に答える
1

さまざまなタイプの asynctask に非常に多くのクラスを使用する代わりに、このライブラリを使用することをお勧めします

ここで見ることができます

http://loopj.com/android-async-http/

あなたのコードは非常に少なくなり、宣言する代わりにasynctaskが個別に大量のコードを書く可能性があります.4行のコードを使用するだけです.

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
       }
});

私は非常に迅速に応答を得るのに非常に効率的です。

これがお役に立てば幸いです。:)

于 2013-08-21T16:11:35.757 に答える