我是 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