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

Android实现网络图片app

2015-06-28 10:48 609 查看


Android实现输入一个网址,就可以看百度图片美女,是不是很心动?
总共分三步:
1.从输入框中获取图片文件路径,在主线程中创建消息处理器,发送http请求:url.openConnection();
2.在创建的子线程中连接服务器get获取图片;
3.在主线程中捕获从子线程 handler.sendMessage(msg)发送回来的消息msg,并解析图片数据,更新使用setImageBitmap()方法更新UI。

废话少说,直接上代码:



import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
protected static final int CHANGE_UI = 1; //帮我改UI
protected static final int ERROR = 2;
private EditText et_path;
private ImageView iView;
//第一步:在主线程中创建消息处理器
private Handler handler=new Handler(){

/*
* (non-Javadoc)第三步: looper 获得 子线程传过来的消息进行 UI更新
* @see android.os.Handler#handleMessage(android.os.Message)
*/

public void handleMessage(android.os.Message msg) { //重写handlemessage方法
if (msg.what==CHANGE_UI) {
Bitmap bitmap= (Bitmap)msg.obj;
iView.setImageBitmap(bitmap);
}
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);
et_path=(EditText)findViewById(R.id.et);
iView=(ImageView)findViewById(R.id.iv);
}

/*
* Android2.X直接在主线程中获取服务器数据,这样如果朋多多任务,主线程就会崩溃 4.0之后舍弃此方法
*/

//public void onClick(View view) {
// String path=et_path.getText().toString().trim(); //获取文件路径
// if (TextUtils.isEmpty(path)) {
// Toast.makeText(MainActivity.this,"图片路径不能为空", 0).show();
// } else {
// //连接服务器get获取图片
// try {
// URL url=new URL(path); //包装路径
// HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection(); //根据url发送http请求
// urlConnection.setRequestMethod("GET"); //指定获取图片的方式——get方式
// urlConnection.setConnectTimeout(5000); //5000毫秒相当于5秒
// int code=urlConnection.getResponseCode(); //得到服务器返回的响应码
// if (code==200) { //200代表获取成功 404代表获取失败
// InputStream iStream=urlConnection.getInputStream();
// Bitmap bitmap=BitmapFactory.decodeStream(iStream); //位图方法——把流转换为Bitmap
// iView.setImageBitmap(bitmap); //显示bitmap
// }else {
// Toast.makeText(MainActivity.this, "显示图片失败", 0).show();
// }
// } catch (Exception e) {
// e.printStackTrace();
// Toast.makeText(MainActivity.this, "获取图片失败", 0).show();
// }
// }
//}
//

/*
* Android4.0之后 改进版,新开辟子线程,在子线程中访问服务器获取数据
*/

public void onClick(View view) {
final String path=et_path.getText().toString().trim();
//获取文件路径
if (TextUtils.isEmpty(path)) {
Toast.makeText(MainActivity.this,"图片路径不能为空", 0).show();
} else {
new Thread(){
public void run() {
//连接服务器get获取图片
try {
URL url=new URL(path); //包装路径 注意:内部类访问外部类,变量要加final
HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection(); //根据url发送http请求
urlConnection.setRequestMethod("GET"); //指定获取图片的方式——get方式
urlConnection.setConnectTimeout(5000); //5000毫秒相当于5秒
int code=urlConnection.getResponseCode(); //得到服务器返回的响应码
if (code==200) { //200代表获取成功 404代表获取失败
InputStream iStream=urlConnection.getInputStream();
Bitmap bitmap=BitmapFactory.decodeStream(iStream); //位图方法——把流转换为Bitmap
//iView.setImageBitmap(bitmap); //显示bitmap

/*
* 第二步:子线程告诉主线程一个消息,帮我更改UI,内容bitmap
*/
Message msg=new Message();
msg.what=CHANGE_UI; //在开头定义CHANGE_UI的宏
msg.obj=bitmap; //obj代表消息里面的数据
handler.sendMessage(msg);

}else {
// Toast.makeText(MainActivity.this, "显示图片失败", 0).show();
Message msg=new Message();
msg.what=ERROR; //在开头定义CHANGE_UI的宏
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg=new Message();
msg.what=ERROR; //在开头定义CHANGE_UI的宏
handler.sendMessage(msg);
//Toast.makeText(MainActivity.this, "获取图片失败", 0).show();
}
}
}.start();
}

}

}

最终效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: