Android实现网络图片app

来源:互联网 发布:c语言 逻辑或 编辑:程序博客网 时间:2024/05/21 18:42

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();
    }
     
   }
   
}

最终效果图:


0 0