java Android,从web获取数据并更新UI(多线程和MVC设计模式)
目前正在开发一个天气应用程序。我要严格遵守两条规则:
- MVC设计模式
- 处理网络时使用多线程李>
问题是将这些东西组合成一个整体,下面是我代码的一部分:
天气类(表示天气对象):
public class Weather {
private int mTimeInSeconds;
private String mTimeZone;
private int mTemperature;
private String mSummary;
public Weather(int timeInSeconds, String timeZone, int temperature, String summary) {
mTimeInSeconds = timeInSeconds;
mTimeZone = timeZone;
mTemperature = temperature;
mSummary = summary;
}
public String getTime() {
SimpleDateFormat formatter = new SimpleDateFormat("h:mm a");
formatter.setTimeZone(TimeZone.getTimeZone(mTimeZone));
Date dateTime = new Date(mTimeInSeconds * 1000);
String timeAsString = formatter.format(dateTime);
return timeAsString;
}
public int getTemperature() {
return mTemperature;
}
public String getSummary() {
return mSummary;
}
}
工人阶级(做所有“肮脏”的工作):
public class Worker {
private final OkHttpClient mClient = new OkHttpClient();
private String apiKey = "Secret!11";
private double latitude = 37.8267;
private double longitude = -122.423;
private String forecastUrl = "https://api.forecast.io/forecast/"
+apiKey
+"/"
+latitude
+","
+longitude;
public void getCurrentWeather() throws Exception {
final Request request = new Request.Builder()
.url(forecastUrl)
.build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.v(MainActivity.TAG, e.getMessage());
}
@Override
public void onResponse(Response response) throws IOException {
try {
JSONObject weatherData = new JSONObject(response.body().string());
JSONObject currentlyWeather = weatherData.getJSONObject("currently");
Log.v(MainActivity.TAG, currentlyWeather.toString());
} catch (JSONException e) {
Log.v(MainActivity.TAG, e.getMessage());
}
}
});
}
}
基于我对MVC的理解,我将所有数据和围绕该数据的逻辑放在模型中(Worker和Weather类)。我想在未来取得这样的成就
主要活动。java:
...
Worker mWorker = new Worker();
Weather mWeather = mWorker.getWeatherData();
...
2个问题:
这是MVC的正确设计吗?(我的意思是,所有以某种方式处理与控制器分离的数据的代码只更新视图)
如果是,我如何实施?我需要归还天气物体 从Worker开始,但是我不能这样做,因为它发生在单独的线程上,我想将Weather对象返回到主线程,但不知道如何实现
# 1 楼答案
Weather.java
类,你的主要活动(以及额外添加的活动)是你的C控制器和 最后,你的layout.xml
文件就是你的V视图。好吧是的, 这是按照MVC模式正确实现的李>Worker.java
类应该是AsyncTask
实施李>使用
AsyncTask
的示例(这只是一个存根实现,请参阅下面的链接以查看完整的工作示例):最后,您将执行以下异步任务:
更多使用AsyncTask here、here和here的示例。 官方文件见here
关于AsyncTask和MVC设计模式
这样做的一个缺点是,AsyncTask必须在MainActivity中实现(或者在任何你想使用它的地方),这与MVC设计相矛盾
解决这个问题的方法是创建一个“HTTP调用方类”,它进行网络调用,并在
AsyncTask doInBackground
方法中调用使用这种方法,你会很乐意去做。您可以让控制器(MainActivity)执行AsyncTask(但不在MainActivity中执行任何实际的网络调用),创建一个新的HttpCallerClass,然后调用一个处理网络的方法。因此,MVC得以保留