模拟一个 从网络中读取一个图片展示到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); } }; };