• Android实现网络图片app


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

    最终效果图:
  • 相关阅读:
    前端面试日更解答 interview-answe 1+1 2020-04-05
    Kafka学习系列----- 消费时序图
    JVM 垃圾回收算法简析
    ORM 框架选型对比
    Spring 中的设计模式之单例模式实现
    Synchroinzed 与lock 锁的区别
    Spring源码分析之ApplicationContextAware
    Springboot 启动简析
    HTTP/2.0 简单分析
    HTTPS 原理简要分析
  • 原文地址:https://www.cnblogs.com/miaozhenzhong/p/5930982.html
Copyright © 2020-2023  润新知