android从20008年的谷歌I/o大会上脱颖而出,在那个还是诺基亚独霸天下的时代,凭借其良好的用户体验,以及开源性,迅速获得了大批用户,最终干掉了诺基亚,同时也将我们从功能机时代带到了智能机时代,android实现了从1.0到6.0的转变,版本之间的差距还是极大的。



好了,言归正传,今天介绍的事android下的访问网络图片的知识,其中一个要点就是和android版本有关!!在android2.3以前的版本,包括2.3,android访问网络的代吗是可以放在主线程的,而在android2.3以后就不可以了,我们必须将一些耗时操作放在子线程中,而且,必须声明一个Handler类,在子线程中将得到的数据发送给Handler类,然后在主线程中操作handler对象,从而实现对androidUI的刷新,android是不支持在子线程对主线程进行刷新的

代码范例:

package com.example.httpweb;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;public class MainActivity extends Activity implements OnClickListener{protected static final int SUCCESS = 0;private Button send;private EditText _url;private ImageView image;private Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);if(msg.what==SUCCESS){image.setImageBitmap((Bitmap) msg.obj);}}};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        send=(Button) findViewById(R.id.send);        _url=(EditText) findViewById(R.id._url);        image=(ImageView) findViewById(R.id.image);    }public void onClick(View v) {// TODO Auto-generated method stubfinal String url=_url.getText().toString();new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stub//设置消息发送给主线程Message message=new Message();message.obj=getBitmapFromNet(url);message.what=0;handler.sendMessage(message);}}).start();}private Bitmap getBitmapFromNet(String string) {HttpURLConnection conn = null;try {URL mURL = new URL(string);// 创建一个url对象// 得到http的连接对象conn = (HttpURLConnection) mURL.openConnection();conn.setRequestMethod("GET");// 设置请求方法为Getconn.setConnectTimeout(10000);// 设置连接服务器的超时时间, 如果超过10秒钟, 没有连接成功, 会抛异常conn.setReadTimeout(5000);// 设置读取数据时超时时间, 如果超过5秒, 抛异常conn.connect();// 开始链接int responseCode = conn.getResponseCode(); // 得到服务器的响应码if(responseCode == 200) {// 访问成功InputStream is = conn.getInputStream();// 获得服务器返回的流数据Bitmap bitmap = BitmapFactory.decodeStream(is); // 根据 流数据 创建一个bitmap位图对象return bitmap;} else {Log.d("my", "访问失败: responseCode = " + responseCode);}} catch (Exception e) {e.printStackTrace();} finally {if(conn != null) {conn.disconnect();// 断开连接}}return null;}  }
如果在主线程中,在android2.3以下机器可以正常运行,而在android2.3以上则会报错 adroid.os。。。。。。。。。。。。。。!!

亲身经历,在几乎快要崩溃的边缘,顿悟出来

更多相关文章

  1. Android——进程与线程
  2. [Android] Android进程和线程模型
  3. Android中的Context对象
  4. android 自定义线程池ThreadPoolUtils工具类
  5. Android进程与线程基本知识四
  6. android利用Handler开启线程和关闭线程
  7. 在Android中使用Handler和Thread线程执行后台操作

随机推荐

  1. Java转dex,dex转smali,smali转Java
  2. Java类的加载和对象创建流程的详细分析
  3. java线程实现与进程(二)
  4. 201521123113 《Java程序设计》第2周学习
  5. java的三大特性之一(继承)
  6. Java使用socket网络编程实现多人聊天室
  7. Java7并发编程--3.4、Phaser并发阶段任务
  8. java并发包之阻塞队列BlockingQueue
  9. Javadoc转换chm帮助文档的四种方法总结
  10. Java并发编程:Concurrent锁机制解析