私は Android 開発の初心者で、最近 MVP パターンを正しく使用する方法を学んでいます。
今、私はトリッキーな問題に直面しています。ここから役立つ提案や解決策が得られることを願っています。
まず、こちらが私のプレゼンターです
public class MVPPresenter {
private MVPView mvpView;
public MVPPresenter(MVPView mvpView) {
this.mvpView = mvpView;
}
public void loadData() {
mvpView.startLoading();
final List<MVPModel> list = new ArrayList<>();
//the part that I trying to extract starts here.
Call call = DataRetriever.getDataByGet(URLCombiner.GET_FRONT_PAGE_ITEMS);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
mvpView.errorLoading();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
try {
JSONObject result = new JSONObject(response.body().string());
int errorCode = result.getInt("ErrorCode");
if (errorCode == 0) {
JSONArray value = result.getJSONObject("Value").getJSONArray("hot");
for (int i = 0; i < value.length(); i++) {
MVPModel mvpModel = new MVPModel();
String name = null;
String image = null;
try {
name = value.getJSONObject(i).getString("title");
image = URLCombiner.IP + value.getJSONObject(i).getString("pic");
} catch (JSONException e) {
e.printStackTrace();
}
mvpModel.setName(name);
mvpModel.setImage(image);
list.add(mvpModel);
}
if (list.size() > 0) {
mvpView.successLoading(list);
mvpView.finishLoading();
} else {
mvpView.errorLoading();
}
} else {
mvpView.errorLoading();
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
mvpView.errorLoading();
}
}
});
//the part that I trying to extract ends here.
}
}
ご覧のとおり、OKHttp ライブラリを使用している部分をクラス (データ マネージャーと呼んでいます) に抽出しようとしています。このクラスがサーバーとクライアント間のすべてのタスクを処理できることを願っています。しかし、データ マネージャーからプレゼンターに結果を渡そうとすると、非同期メカニズムが原因で NullPointException が発生しました。
データのダウンロードが完了したときに、非同期でサーバーからデータをプレゼンターに渡す方法を知りたいです。
そして、これが私の理想的なデータマネージャーです。これはばかげているように見えるかもしれませんが、これにより問題がより明確になると思います。
public class LoadServerData {
private static JSONArray arrayData = new JSONArray();
public static JSONArray getServerData() {
Call call = DataRetriever.getDataByGet(URLCombiner.GET_FRONT_PAGE_ITEMS);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
try {
JSONObject result = new JSONObject(response.body().string());
int errorCode = result.getInt("ErrorCode");
if (errorCode == 0) {
arrayData = result.getJSONObject("Value").getJSONArray("hot"); //the data I would like to return.
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
return arrayData; //this is gonna be an empty data.
}
}
私の問題を解決できるかもしれない記事を読んだことがありますが、それでも良い答えは得られません。おそらく私は間違ったキーワードを使用していると思います。皆さんが私を助けたり刺激したりするためのアイデアや解決策を教えてくれることを願っています.
OKhttp ライブラリの PS バージョンは 3.7.0 です