Androidアプリの開発を始めようとしています。アプリで Otto または EventBus を使用して、非同期 REST ネットワーク呼び出しを行い、呼び出しが返されたときにメイン スレッドに通知することに関心があります。これらのバスの使用に関する大きな欠陥の 1 つは、調査中に発見したことです。通常、作成する必要があるイベント クラスが多すぎます。使用する必要があるイベント クラスの数を減らすためのパターンやアプローチはありますか?
1 に答える
コンセプト
あまりにも多くのイベント クラスの問題を解決した最善の方法は、静的なネストされたクラスを使用することです。詳細については、こちらを参照してください。
ここで上記の概念を使用して、問題を解決する方法を次に示します。
したがって、基本的に、アプリケーションで渡すオブジェクトを作成するために使用する Doctor というクラスがあるとします。ただし、同じオブジェクトをネットワーク経由で送信し、同じオブジェクトのコンテキストで JSON を取得し、それをサブスクライバーにフィードバックして何かを行う必要があります。おそらく2つのクラスを作成します
- 返された JSON データに関する情報を含むDoctorJsonObject.java
- アプリで渡すデータを含むDoctorObject.java 。
その必要はありません。 代わりにこれを行います:
public class Doctor{
static class JSONData{
String name;
String ward;
String id;
//Add your getters and setter
}
static class AppData{
public AppData(String username, String password){
//do something within your constructor
}
String username;
String password;
//Add your getters and setters
}
}
これで、ネットワークへのポストとネットワークからのポスト バックの両方のイベントをカプセル化する 1 つの Doctors クラスが作成されました。
Doctor.JSONDataは、ネットワークから返されたデータを Json 形式で表します。
Doctor.AppDataは、アプリ内で渡される「モデル」データを表します。
クラスの AppData オブジェクトをポスト イベントに使用するには、次のようにします。
/*
You would post data from a fragment to fetch data from your server.
The data being posted within your app lets say is packaged as a doctor
object with a doctors username and password.
*/
public function postRequest(){
bus.post(new Doctor.AppData("doctors_username","doctros_password"));
}
このオブジェクトをリッスンし、http 要求を作成して Doctor.JSONData を返す実装内のサブスクライバー:
/*
retrofit implementation containing
the listener for that doctor's post
*/
@Subscribe
public void doctorsLogin(Doctor.AppData doc){
//put the Doctor.JSONObject in the callback
api.getDoctor(doc.getDoctorsName(), doc.getPassWord(), new Callback<Doctor.JSONObject>() {
@Override
public void success(Doctor.JSONObject doc, Response response) {
bus.post(doc);
}
@Override
public void failure(RetrofitError e) {
//handle error
}
});
}
}
上記の実装では、Doctor オブジェクトに関連するすべてのイベントを 1 つの Doctor クラス内にカプセル化し、静的な内部クラスを使用して、さまざまなタイミングで必要なさまざまなタイプのオブジェクトにアクセスしました。クラスが減り、より構造化されます。