android访问网络,下载图片,并设置UI

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(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.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 stub
		final String url=_url.getText().toString();
		
	new Thread(new Runnable(){

		@Override
		public 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");		// 设置请求方法为Get
			conn.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。。。。。。。。。。。。。。!!

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

你可能感兴趣的:(android)