在做一个天气预报的widget的时候,参考了一个源代码,但是一直报错,就从里面抠出来获取天气的代码试试看,结果总是报错
就是这个异常,android.os.NetworkOnMainThreadException
代码是这样的:
MainActivity:
public class MainActivity extends Activity {
MyWeather myWeather;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myWeather = new MyWeather();
System.out.println(myWeather.getCity());
}
}
MyWeather:
public class MyWeather {
public String city;
public String temp1;
public String weather1;
public String img1;
public MyWeather(){
getWeather();
}
public void getWeather(){
try {
URL url = new URL("http://m.weather.com.cn/data/101250101.html");
InputStream is = url.openStream();
int len = -1;
byte[] buffer = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = is.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
String info = bos.toString("utf-8");
JSONObject dataJson = new JSONObject(info);
JSONObject json = dataJson.getJSONObject("weatherinfo");
city = json.getString("city");
temp1 = json.getString("temp1");
weather1 = json.getString("weather1");
img1 = json.getString("img1");
bos.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (JSONException e) {
// TODO: handle exception
}
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getTemp1() {
return temp1;
}
public void setTemp1(String temp1) {
this.temp1 = temp1;
}
public String getWeather1() {
return weather1;
}
public void setWeather1(String weather1) {
this.weather1 = weather1;
}
public String getImg1() {
return img1;
}
public void setImg1(String img1) {
this.img1 = img1;
}
}
经过查阅资料,大体错误应该是这样的,主要是说主线程访问网络时出的异常。
Android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了。
于是把MainActivity的代码改成如下就可以了,在新开的线程中读取天气,用handler异步加载:
public class MainActivity extends Activity {
MyWeather myWeather;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
System.out.println("jason.com" + myWeather.getCity());
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
myWeather = new MyWeather();
Message msg = handler.obtainMessage();
msg.what = 0;
handler.sendMessage(msg);
}
}.start();
}
}
作者:jason0539
微博:http://weibo.com/2553717707
博客:http://blog.csdn.net/jason0539(转载请说明出处)