android错误之android.os.NetworkOnMainThreadException

在做一个天气预报的widget的时候,参考了一个源代码,但是一直报错,就从里面抠出来获取天气的代码试试看,结果总是报错 就是这个异常,android.os.NetworkOnMainThreadException代码是这样的:MainActivity:public class MainActivity extends Activity { MyWeather myWe

大家好,又见面了,我是全栈君。

在做一个天气预报的widget的时候,参考了一个源代码,但是一直报错,就从里面抠出来获取天气的代码试试看,结果总是报错

 android错误之android.os.NetworkOnMainThreadException

就是这个异常,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(转载请说明出处)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121392.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BZOJ-9-3295: [Cqoi2011]动态逆序对[通俗易懂]

    BZOJ-9-3295: [Cqoi2011]动态逆序对[通俗易懂]BZOJ-9-3295: [Cqoi2011]动态逆序对

    2022年4月21日
    39
  • python列表相加的方法:两个list [] 加法

    python列表相加的方法:两个list [] 加法简明扼要:Pythonlist相加的方法

    2022年7月13日
    26
  • 数组长度计算_c语言计算数组长度的函数

    数组长度计算_c语言计算数组长度的函数(1)sizeof方法:sizeof(数组名)/sizeof(数组类型名)说明:数组占用字节除以数组类型所占字节,结果为数组元素个数(2)strlen说明:strlen,求字符串有效长度方法

    2022年8月5日
    2
  • Landsat TM 波段组合[通俗易懂]

    Landsat TM 波段组合[通俗易懂]附录2:LandsatTM波段组合(NASA网页99-10-18)3,2,1这种RGB组合模拟出一副自然色的图象。有时用于海岸线的研究和烟柱的探测。4,5,3用于土壤湿度和植被状况的分析。也很好的用于内陆水体和陆地/水体边界的确定。4,3,2红外假色。在植被、农作物、土地利用和湿地分析的遥感方面,这是最常用的波段组合。7,4,2土壤和植被湿度内容分析;内陆水

    2022年7月23日
    16
  • docker的端口映射_外网远程桌面端口映射

    docker的端口映射_外网远程桌面端口映射Docker端口映射实现网络访问首先,大家如果看到有什么不懂的地方,欢迎吐槽!!!我会在当天或者第二天及时回复,并且改进~~Docker运行容器之后却发现没IP,没端口,那要如何访问容器呢?下面我来介绍下Docker通过端口映射来实现网络访问一、从外部访问容器应用在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数指定端口映射。先来说说p和P吧-p可以指定要映射的端口,并

    2022年10月9日
    6
  • 登录注册HTML页面代码「建议收藏」

    登录注册HTML页面代码「建议收藏」一、注册创建register.html文件,录入如下代码<!DOCTYPEhtml><html><head><metacharset=”UTF-8″><title></title><styletype=”text/css”>form{width:100%;

    2022年6月10日
    88

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号