Android 网络访问 线程注意事项

模拟一个 从网络中读取一个图片展示到imageView的操作:

注意事项1:

        URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

       执行此方法用来开辟一个URL请求,该请求在Android4.0版本以后需要放到子线程中实现,主线程已不支持httprequest请求(android2.3仍然支持此项)

        InputStream inputStream = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
// iv.setImageBitmap(bitmap);

        第三句则会报错 :android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

 注意事项2:  因为在子线程中不可以对view操作,因为view是在主线程创建的,需要在子线程中以消息的形式通知主线程

new Thread()
			{
				public void run()
				{
					try {
						URL url = new URL(path);
						HttpURLConnection conn = (HttpURLConnection) url.openConnection();
						conn.setRequestMethod("GET");
						conn.setConnectTimeout(5000);
						conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Shuame)");
						int responseCode = conn.getResponseCode();
						if(responseCode==200)
						{
							InputStream inputStream = conn.getInputStream();
							Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//							iv.setImageBitmap(bitmap);
                                         //采用传送消息的模式 把view操作消息发给主线程
							Message msg = new Message();
							msg.what=CHANGE_UI;
							msg.obj=bitmap;
							handler.sendMessage(msg);
						}
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						Toast.makeText(MainActivity.this, "访问网络失败",0).show();
					}
				}
			}.start();
主activity中定义handler:

private Handler handler =new Handler(){
		public void handleMessage(android.os.Message msg)
		{
			if(msg.what==CHANGE_UI)
			{
				iv.setImageBitmap((Bitmap) msg.obj);
			}
		};
	};



      

       

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。