在天气APP的MainActivity中需要调用Weather类中的requestWeather(),在网上获得天气数据,并要求requestWeather()在获得完天气数据之后,将天气数据返回给MainActivity(即回调),这样MainActivity就能够在获得天气数据之后更新UI。
首选需要定义一个接口WeatherDataListener
public interface WeatherDataListener {
/**
* 天气数据网络加载并且解析完毕
* @param weatherInfoList
*/
void onWeatherDataLoaded(List<WeatherInfo> weatherInfoList);
}
在Weather中定义requestWeather()方法
public void requestWeather(final WeatherDataListener weatherDataListener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(weatherUrl());//weatherUrl()是天气请求url
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
BufferedReader buffer = new BufferedReader(new InputStreamReader(in));
StringBuilder builder = new StringBuilder();
String s;
if ((s = buffer.readLine()) != null)
builder.append(s);
parseData(builder.toString());
weatherDataListener.onWeatherDataLoaded(weatherInfoList);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
对于MainActivity有两种方式,一种是直接实现接口WeatherDataListener ,另一种是在类中实new接口WeatherDataListener
方法1:
public class MainActivity extends Activity implements WeatherDataListener {
...
Weather weather=new Weather();
weather.requestWeather(this);
@Override
public void onWeatherDataLoaded(final List<WeatherInfo> weatherInfoList){
runOnUiThread(new Runnable(){
@Override
public void run() {
//更新UI
}
});
}
}
方法2:
public class MainActivity extends Activity{
......
Weather weather=new Weather();
weather.requestWeather(weatherDataListener);
private WeatherDataListener weatherDataListener=new WeatherDataListener() {
@Override
public void onWeatherDataLoaded(final List<WeatherInfo> weatherInfoList) {
runOnUiThread(new Runnable(){
@Override
public void run() {
//更新UI
}
});
}
};
}
方法3:
public class MainActivity extends Activity{
......
Weather weather=new Weather();
weather.requestWeather(new WeatherDataListener() {
@Override
public void onWeatherDataLoaded(List<WeatherInfo> weatherInfoList) {
runOnUiThread(new Runnable(){
@Override
public void run() {
//更新UI
}
});
}});
}