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)
上一篇 2022年3月10日 下午7:00
下一篇 2022年3月10日 下午7:00


相关推荐

  • 开源渗透测试工具合集下载_系统渗透测试

    开源渗透测试工具合集下载_系统渗透测试开源渗透工具集合:子域名爆破、FUZZ工具、自动化渗透测试工具、漏洞利用框架、CVE、漏洞测试平台、漏洞扫描工具、远控工具、SQL注入攻击、代理工具、弱口令爆破工具

    2022年8月12日
    10
  • netstat 工具

    netstat 工具netstat工具netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况netstat-a或–all#显示所有连线中的Socketnetstat-at#列出所有tcp端口netstat-au#列出所有udp端口#列出所有处于监听状态的Socketsnetsta…

    2022年7月22日
    13
  • Linux中为SSH启用双因素身份验证

    Linux中为SSH启用双因素身份验证无论您是将 FedoraLinux 用于桌面还是服务器 都应考虑为 SecureShell SSH 登录启用双因素身份验证 为什么 因为 SSH 是远程登录服务器的主要方式 所以您最不希望的是将该服务保持打开状态以进行攻击 更好地锁定它的一种方法是为 SSH 启用双因素身份验证 我想引导您完成这样做的步骤 这样您就可以享受 Fedora 台式机和服务器的更高安全性 准备 Fedora

    2025年8月4日
    8
  • 如何构建NTP时间服务器「建议收藏」

    NTP服务器是用于局域网服务器时间同步使用的,可以保证局域网所有的服务器与时间服务器的时间保持一致,某些应用对时间实时性要求高的必须统一时间。互联网的时间服务器也有很多,例如ntpdatentp.fudan.edu.cn复旦大学的NTP免费提供互联网时间同步。NTP服务器监听端口为UDP的123,那就需要在本地防火墙开启运行客户端访问123端口,vi/etc/sysconfig/iptables添加如下规则:-AINPUT-mstate–stateNEW-mudp-pudp

    2022年4月12日
    32
  • HLSL 与 GLSL 之间的映射关系参考[通俗易懂]

    HLSL 与 GLSL 之间的映射关系参考[通俗易懂]系统参数与內建的输入参数Direct3D有很多系统参数,而相应的,GLSL也有內建的输入参数的概念。他们的对应关系如下:HLSLGLSLSV_ClipDistancegl_ClipDistanceSV_CullDistance当存在ARB_cull_distance情况下gl_CullDistanceSV_Coveragegl_SampleMaskIn&gl_SampleMaskSV_Depth

    2022年7月15日
    25
  • K3 官改新手小白配置阿里DDNS 超级详细「建议收藏」

    K3 官改新手小白配置阿里DDNS 超级详细「建议收藏」K3官改新手小白配置阿里DDNS超级详细写的比较仓促,不对之处请指正,这个是写给小白看的,大神勿喷首先介绍一下什么是DDNSDDNS(DynamicDomainNameServer)是动态域名服务的缩写。DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器…

    2022年6月12日
    45

发表回复

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

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