您的位置:首页 > 理论基础 > 计算机网络

android从网络上拿图的几个方式

2016-01-11 21:48 369 查看
注:从网络上获取数据,不能写在主线程里

localhost,127.0.0.1不可用

更新UI界面不能写在下面的new Thread() {...中

否则报错:Only the original thread that created a view hierarchy can touch its views。

// /第一种

private Handler handler2 = new Handler() {

public void handleMessage(android.os.Message msg) {

switch (msg.what) {

case 1:

imageView.setImageBitmap((Bitmap) msg.obj);

break;

default:

break;

}

};

};

//new个线程,使用Handler更新UI界面

public void getImg() {

new Thread() {

@Override

public void run() {

String path = "http://pic14.nipic.com/20110522/7411759_164157418126_2.jpg";

try {

URL url = new URL(path);

HttpURLConnection connection = (HttpURLConnection) url

.openConnection();

// 设置超时

connection.setConnectTimeout(5000);

//

// 设置方式

connection.setRequestMethod("GET");

// 连接成功

if (connection.getResponseCode() == 200) {

InputStream inputStream = connection.getInputStream();

//

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

// 1使用message

//设置message

Message message = new Message();

//设置标志码

message.what = 1;

//绑定资源

message.obj = bitmap;

handler2.sendMessage(message);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}.start();

}

//---------第二种---------------------------------------------

// AsyncTask:从网络拿图(不需要new 线程)

private class MyTask extends AsyncTask<String, String, Bitmap> {

Bitmap bitmap = null;

/*

* (non-Javadoc)

*

* @see android.os.AsyncTask#doInBackground(Params[])

*/

@Override

protected Bitmap doInBackground(String... params) {

try {

URL url = new URL(params[0]);

HttpURLConnection connection = (HttpURLConnection) url

.openConnection();

connection.setReadTimeout(5000);

connection.setRequestMethod("GET");

if (connection.getResponseCode() == 200) {

bitmap = BitmapFactory.decodeStream(connection

.getInputStream());

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return bitmap;

}

/*

* (non-Javadoc)

*

* @see android.os.AsyncTask#onPreExecute()

*/

@Override

protected void onPreExecute() {

// TODO Auto-generated method stub

progressBar.setVisibility(View.VISIBLE);

imageView.setVisibility(View.INVISIBLE);

super.onPreExecute();

}

/*

* (non-Javadoc)

*

* @see android.os.AsyncTask#onPostExecute(java.lang.Object)

*/

@Override

protected void onPostExecute(Bitmap result) {

//

progressBar.setVisibility(View.GONE);

imageView.setVisibility(View.VISIBLE);

// 改变UI界面

imageView.setImageBitmap(result);

}

/*

* (non-Javadoc)

*

* @see android.os.AsyncTask#onProgressUpdate(Progress[])

*/

@Override

protected void onProgressUpdate(String... values) {

// TODO Auto-generated method stub

super.onProgressUpdate(values);

}

}

//调用该类

new MyTask().execute("一张图片网址");

//上面更新UI界面,除使用handler+message,还可以使用handler+runnable

后面的使用方法我在网上看到一篇很好的介绍:
http://blog.csdn.net/djx123456/article/details/6325983
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: