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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Google Doodle:龙年 新春快乐 龙年进步!

    Google Doodle:龙年 新春快乐 龙年进步!看过春晚,放过×××,Google终于在北京时间1月23日的凌晨放出了龙年的Doodle: 转载于:https://blog.51cto.com/maclean/1278817

    2022年7月26日
    1
  • 【已解决】Redis连接——Could not connect to Redis at 127.0.0.1:6379: Connection refused[通俗易懂]

    【已解决】Redis连接——Could not connect to Redis at 127.0.0.1:6379: Connection refused[通俗易懂]相信很多人很可能刚上手使用Redis时,很容易遇到的问题就是CouldnotconnecttoRedisat127.0.0.1:6379:Connectionrefused。由于只是记录bug解决,所以开门见山,宜春不多哔哔…其实原因很简单,这个问题一般是关闭了服务端导致客户端打不开,最简单快捷解决办法就是先开启服务端,再去连接客户端!如下:开启服务端需要先配置(redis.con…

    2022年6月6日
    1.1K
  • python怎样安装whl文件

    python怎样安装whl文件python第三方组件有很多都是whl文件,遇到这样的whl文件应该怎样安装呢,今天来介绍一下whl文件怎样安装。(一)下载whl文件可以从下面;两个网站找到自己需要的whl文件,部分文件在国内网站上没有,pypi网站上是最全的。pypi网站:https://pypi.python.org/pypi/国内whl集合网:https://www.l…

    2022年4月5日
    107
  • 记一次CTF的USB流量分析

    记一次CTF的USB流量分析最近在研究鼠标流量,找到如下的文章:https://www.cnblogs.com/hackxf/p/10670844.html根据这个师傅的说法,不同的鼠标抓到的流量不一样,一般的鼠标流量是四个字节,第一个字节表示按键指示左键右键,第二个字节表示水平位移,为正(小于127)是向右移动,为负(补码负数,大于127小于255)是向左移动。第三个字节表示垂直位移,为正(小于127)是向上移动,为负…

    2022年5月29日
    179
  • c++、webServices、gsoap、tinyxml、iconv

    c++、webServices、gsoap、tinyxml、iconv

    2022年3月13日
    33
  • 线程池详解(通俗易懂超级好)「建议收藏」

    线程池详解(通俗易懂超级好)「建议收藏」目标【理解】线程池基本概念【理解】线程池工作原理【掌握】自定义线程池【应用】java内置线程池【应用】使用java内置线程池完成综合案例线程池线程池基础线程池使用线程池综合案例4.学员练习5.线程池总结概念介绍1:什么是线程池2:为什么使用线程池3:线程池有哪些优势什么是池什么是线程池线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runna.

    2022年10月24日
    0

发表回复

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

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