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。。。。。。。。。。。。。。!!
亲身经历,在几乎快要崩溃的边缘,顿悟出来