zoukankan      html  css  js  c++  java
  • Android 网络图片查看器

    由于android下的网络连接不能在主线程操作,另外UI的改变也只能通过主线程来变化,所以一般来说操作网络我们都要开启一个子线程执行,而UI的改变则通过handler消息传递给主线程,委托主线程操作。

    以下是一个android网络图片查看器,需要传入一个URL地址来查看该图片:

    package com.wuyou.webimgbrowser;
    
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.ActionBarActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class MainActivity extends ActionBarActivity {
    
        //常量:改变显示的图片
        private static final int CHANGE_IMG = 1;
        private static final int ERROR = 2;
    
        private ImageView imageView;
        private EditText editText;
        private Button button;
    
        //消息处理器
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == CHANGE_IMG) {
                    Bitmap bitmap = (Bitmap) msg.obj;
                    imageView.setImageBitmap(bitmap);
                } else if (msg.what == ERROR) {
                    Toast.makeText(MainActivity.this, "获取图片失败!", Toast.LENGTH_LONG).show();
                }
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            imageView = (ImageView) findViewById(R.id.iv);
            editText = (EditText) findViewById(R.id.et);
            button = (Button) findViewById(R.id.bt);
    
        }
    
        public void click(View view) {
            final String path = editText.getText().toString().trim();
    
            //子线程不能修改UI,只能通过消息发送到主线程,让主线程代替修改UI
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if (TextUtils.isEmpty(path)) {
                        sendError(null);
                    } else {
                        try {
                            System.out.println("path = " + path);
                            URL url = new URL(path);
                            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                            httpURLConnection.setRequestMethod("GET");//设置以get方式获取资源
                            httpURLConnection.setConnectTimeout(5000);//设置连接服务器如果没有在5秒钟运行则抛出错误
                            httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");
                            if (httpURLConnection.getResponseCode() == 200) {
                                InputStream inputStream = httpURLConnection.getInputStream();
                                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                                Message message = new Message();
                                message.what = CHANGE_IMG;
                                message.obj = bitmap;
                                handler.sendMessage(message);
                            } else {
                                sendError(null);
                            }
                        } catch (Exception e) {
                            sendError(e);
                        }
                    }
                }
    
                //发送错误
                private void sendError(Exception e) {
                    if (e != null) {
                        e.printStackTrace();
                    }
                    Message message = new Message();
                    message.what = ERROR;
                    handler.sendMessage(message);
                }
            }).start();
        }
    
    
    }

    其中布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical"
        tools:ignore="MergeRootFrame">
    
        <ImageView
            android:id="@+id/iv"
            android:layout_weight="3000"
            android:layout_height="match_parent"
            android:layout_width="match_parent" />
    
        <EditText
            android:text="http://image.sjrjy.com/201011/291354164ea84578066309.jpg"
            android:lines="1"
            android:id="@+id/et"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    
        <Button
            android:id="@+id/bt"
            android:text="浏览图片"
            android:onClick="click"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
    
    </LinearLayout>

    最后不要忘了在清单文件添加:(网络连接的权限)

    <uses-permission android:name="android.permission.INTERNET" />

  • 相关阅读:
    隐私政策
    常用SQL语句总结
    C++读写配置项
    GridControl中事件
    DEV ListBoxControl
    DEV LookUpEdit 下拉框
    DataTable GridControl 数据结构
    django + celery + channels.websocket 异步任务
    微信消息推送,获取access_token时AppSecret错误或者access_token无效 invalid credential, access_token is invalid or not latest rid
    sqlserver 表生成实体类
  • 原文地址:https://www.cnblogs.com/wuyou/p/3426789.html
Copyright © 2011-2022 走看看