一戒745zia4sgs / 网络 / Android 网络访问 线程注意事项

分享

   

Android 网络访问 线程注意事项

2016-01-14  一戒745zi...

常识1:httprequest请求Android4.0版本以后需要放到子线程中实现,主线程已不支持httprequest请求(android2.3仍然支持此项.所以你在onCreate里面进行httpRequest请求才不报错但是方法缺不执行(正确方式newThread().start()



模拟一个 从网络中读取一个图片展示到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是在主线程创建的,需要在子线程中以消息的形式通知主线程

  1. new Thread()  
  2.             {  
  3.                 public void run()  
  4.                 {  
  5.                     try {  
  6.                         URL url = new URL(path);  
  7.                         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  8.                         conn.setRequestMethod("GET");  
  9.                         conn.setConnectTimeout(5000);  
  10.                         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)");  
  11.                         int responseCode = conn.getResponseCode();  
  12.                         if(responseCode==200)  
  13.                         {  
  14.                             InputStream inputStream = conn.getInputStream();  
  15.                             Bitmap bitmap = BitmapFactory.decodeStream(inputStream);  
  16. //                          iv.setImageBitmap(bitmap);  
  1.                                       //采用传送消息的模式 把view操作消息发给主线程  
  2.                 Message msg = new Message();  
  3.                 msg.what=CHANGE_UI;  
  4.                 msg.obj=bitmap;  
  5.                 handler.sendMessage(msg);  
  6.             }  
  7.         } catch (Exception e) {  
  8.             // TODO Auto-generated catch block  
  9.             e.printStackTrace();  
  10.             Toast.makeText(MainActivity.this"访问网络失败",0).show();  
  11.         }  
  12.     }  
  13. }.start();  
主activity中定义handler:

  1. private Handler handler =new Handler(){  
  2.         public void handleMessage(android.os.Message msg)  
  3.         {  
  4.             if(msg.what==CHANGE_UI)  
  5.             {  
  6.                 iv.setImageBitmap((Bitmap) msg.obj);  
  7.             }  
  8.         };  
  9.     };  



      

       

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>