5

私のアプリでは、GET、POST、PUT リクエストがたくさんあります。現在、ダウンロードしたデータを保持するシングルトン クラスがあり、AsyncTask を拡張する多くの内部クラスがあります。私のシングルトンクラスには、次のようなインターフェースもいくつかあります。

/**
* Handlers for notifying listeners when data is downloaded
* 
*/
public interface OnQuestionsLoadedListener {

    public void onDataLoadComplete();

    public void onDataLoadingError();       
}

このパターン (AsyncTask を拡張する多くの内部クラス) に何か問題がありますか? HTTP 呼び出しごとに 1 つの内部クラス (GET 用に 1 つ、POST 用に 1 つなど) を使用して、より効率的に実行できますか? もしそうなら、例えばGETリクエストの後に何をすべきかをどのように決定するのですか?

4

3 に答える 3

4

全体として、ネットワーク リクエストを実行している間は AsyncTasks から離れるべきです。

AsyncTask はアクティビティにリンクされています。つまり、アクティビティが停止すると、AsyncTask が停止します。フェッチが停止したことを気にしないため、そのアクティビティに表示するデータをフェッチする場合、これは最大の問題ではありません。しかし、保存したデータをサーバーに送信したい場合、すべてが送信される前にユーザーが「戻る」などを押すと、データが失われて送信されない可能性があります。

代わりに必要なのは、アクティビティに何が起こっても実行し続けるサービスです。

RoboSpiceを調べてみることをお勧めします。使用しないことにした場合でも、ネットワーク リクエストに AsyncTasks を使用しない理由と、Services を使用する方がよい理由のかなり長いリストについて、その機能とその理由を読むと、良い洞察が得られます。これを使用すると、効率的なネットワーク要求に関する残りの質問も時代遅れになります。可能な限り最善の方法で処理してくれるからです。

于 2013-03-22T12:47:59.210 に答える
1

多くの非同期クラスに問題はありません。

idoにはネットワーク層、サービスクラスがあります。インテントの一部として resultreceiver オブジェクトを使用して、インテントをサービス クラスに送信します。次に、サービスで非同期タスクでhttpリクエストを作成し、結果レシーバーオブジェクトを介して結果を返信します。

適切な設計は、ネットワーク アクセスから ui (アクティビティまたはフラグメント) を抽象化することです。

于 2013-03-22T12:49:01.293 に答える
0

最近開発されたアプリでは、同様のスキームに従いましたが、さらに実際のGET、POST、PUTなどを実行するWebRequestクラスを実装しました。

私が今持っているのは、AsyncTaskサブクラスがたくさんある「Connector」クラスです。ただし、私の実装では、これらのサブクラスのそれぞれがHttpの結果を渡すCallbackオブジェクトを受け入れるようにしました。

おそらく理想的ではないにしても、これは有効な方法だと思います。

私が想像するのは、Asynctaskのサブクラスが1つだけあり、そこにリクエストの本文(現在はこれらのさまざまなタスク内に構築されている)、リクエストのURLとメソッド、およびコールバック(つまり、私の意見では、結果を得るためのかなり良い方法です)。

于 2013-03-22T12:39:03.623 に答える