本案例中,将会实现通过HttpURLConnection对象的方法,将指定url的网络图片加载到本地,并显示在预设的ImageView中。
主要实现步骤:
1. 新建一个方法private Bitmap getImageFromNet(String url),传入图片的url字符串,据此创建一个URL对象mURL。
2. 利用mURL的openConnection()方法,初始化一个HttpURLConnection连接对象conn,并设置请求方法和超时时间。
3. 连接后获得服务器返回的链接码,如果判断为访问成功,则获得服务器返回的流数据,并通过BitmapFactory中的decodeStream()方法获得bitmap对象。(最后不要忘记disconnect()断开连接。)
4. 当点击按钮触发事件后,在子线程中执行getImageFromNet()方法,根据返回的bitmap是否为null,向Handler发送相应的数据。
5. 在Handler中重写handleMessage()方法,如果返回的message表明成功,则在ImageView中setImageBitmap,否则提示获取图片失败。
具体代码如下:
MainActivity.class
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
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.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = "MainActivity";
private EditText etUrl;
private ImageView ivIcon;
private final int SUCCESS = 0;
private final int ERROR = 1;
private Handler handler = new Handler() {
//接收消息
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == SUCCESS) { //当前是访问网络,去显示图片
ivIcon.setImageBitmap((Bitmap) msg.obj);
} else if(msg.what == ERROR) {
Toast.makeText(MainActivity.this, "抓取失败", 0).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivIcon = (ImageView) findViewById(R.id.iv_icon);
findViewById(R.id.btn_go).setOnClickListener(this);
}
@Override
public void onClick(View v) {
final String url = etUrl.getText().toString();
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = getImageFromNet(url);
//
if(bitmap != null) {
Message msg = new Message();
msg.what = SUCCESS;
msg.obj = bitmap;
handler.sendMessage(msg);
} else {
Message msg = new Message();
msg.what = ERROR;
handler.sendMessage(msg);
}
}
}).start();
}
/**
*
* @param url
* @return
*/
private Bitmap getImageFromNet(String url) {
HttpURLConnection conn = null;
try {
URL mURL = new URL(url); //创建一个url对象
//得到http连接对象
conn = (HttpURLConnection) mURL.openConnection();
conn.setRequestMethod("GET"); //设置请求方法为GET
conn.setConnectTimeout(10000);//连接服务器的超时时间,若超过10s则异常
conn.setReadTimeout(5000);//读取图片的超时时间,超过5s则异常
conn.connect();
int responseCode = conn.getResponseCode(); //得到服务器的响应码
if (responseCode == 200) {
//访问成功
InputStream is = conn.getInputStream(); //获得服务器返回的流数据
Bitmap bitmap = BitmapFactory.decodeStream(is); //根据流数据创建一个Bitmap位图对象
return bitmap;
} else {
Log.i(TAG, "访问失败:responseCode = "+ responseCode);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect(); //断开连接
}
}
return null;
}
}