zoukankan      html  css  js  c++  java
  • android开发获取网络图片,读取进度条

    本章写一个程序用来读取网络图片的功能,实现一个功能读取到服务器上的一张图片,然后下载到本地的程序本程序使用多线程来读取网络图片,包括自动判断缓存文件,还有进度条。别的不多说,上内容,我把实现过程都当做注释写到程序里了,很完全。希望对初学的朋友有帮助!

    1、读取进度条的效果

    image

    2、成功读取到图片的效果

    image

    1.首先是Activity 

    package cn.itcast.pic;
    
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class mainActivity extends Activity {
        private TextView addressET;
        private ImageView imageIV;
        private Handler handler=new Handler(); //在主线程中创建handler
        private ProgressDialog dialog;
        private ImageService service;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //1、获取对话框的id
            addressET = (TextView) this.findViewById(R.id.addressET);
            imageIV = (ImageView) this.findViewById(R.id.imageIV);
            
            service = new ImageService(this);
            
        }
        
        public void onClick(View v){
            //把图片放在一个新的线程里面来读取.
            new Thread(){//创建一个新的线程
                public void run(){
                    try {
                    String address = addressET.getText().toString();
                    
                    handler.post(new Runnable() {//此处用一个匿名内部类,runnable自动把消息发送给主线程创建处理的handler,主线程会自动更新。
                        public void run() {
    
                            dialog=new ProgressDialog(mainActivity.this);
                            dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置进度条样式
                            dialog.setMessage("请稍候...");
                            dialog.setCancelable(false);//判断是否取消进度条
                            dialog.show();
                        }
                    });
                        
                    
                        //由于网络操作比较耗时,所以在新线程中操作
                        final Bitmap image = service.getImage(address);
                        handler.post(new Runnable() {
                            public void run() {
                                dialog.dismiss();
                                imageIV.setImageBitmap(image);//新线程更新界面,需要使用handler
                            }
                        });
                    } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(getApplicationContext(), "服务器忙,请稍后再试!", 0).show();
                    }
                }
            }.start();
        }
    }

                

    2.然后是读取图片的service

    package cn.itcast.pic;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    
    import android.accounts.NetworkErrorException;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.BitmapFactory;
    
    public class ImageService {
    
        private Context context;
    
        public ImageService(Context context) {
            super();
            this.context = context;
        }
    
        public Bitmap getImage(String address) throws Exception {
            // 1.通过Url对象封装url对象
            URL url = new URL(address);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(3000);
    
            // 2.判断是否有缓存文件
            File cacheFile = new File(context.getCacheDir(),
                    URLEncoder.encode(address));// 缓存文件
            if (cacheFile.exists())// 判断是否有缓存
                conn.setIfModifiedSince(cacheFile.lastModified());// 发送缓存文件的最后修改时间
    
            // 3.获取状态码,根据状态吗来判断接下来的操作。读取文件?还是写缓存,写缓存的时候记着用多个线程
            int code = conn.getResponseCode();
            if (code == 200) {
                byte[] data = Util.read(conn.getInputStream());
                Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);// 转化为图片
                weiteCache(cacheFile, bm);
                return bm;
            } else if(code==304){
                return BitmapFactory.decodeFile(cacheFile.getAbsolutePath());//读取本地数据,并转为图片来显示
            }
            
    //        如果不成功,抛异常,给我们自己看的
            throw new NetworkErrorException("访问服务器出错:"+code);
            
    
        }
    
        // 4. 写缓存文件
        private void weiteCache(final File cacheFile, final Bitmap bm) {
            // 使用一个新的线程来写,这样的好处就是在页面打开的时候不会因为写缓存而等待时间
            new Thread() {
                public void run() {
                    try {
                        FileOutputStream fos = new FileOutputStream(cacheFile);
                        bm.compress(CompressFormat.JPEG, 100, fos);//指定格式 存储到本地
                        fos.close();
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
    
                }
            }.start();
    
        }
    
    }

    3.读取网络文件的一个工具类

    package cn.itcast.pic;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class Util {
    
        public static byte[] read(InputStream in) throws IOException {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) != -1)
                baos.write(buffer, 0, len);
            baos.close();
            byte[] data = baos.toByteArray();
            return data;
        }
        
    }

    4.主界面XML

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
    
            <EditText
                android:id="@+id/addressET"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:inputType="textEmailAddress" >
    
                <requestFocus />
            </EditText>
    
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="onClick"
                android:text=" GO " />
        </LinearLayout>
    
        <ImageView
            android:id="@+id/imageIV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
  • 相关阅读:
    团队绩效打分
    软件对标分析
    目前校园百晓生APP与CSDN软件的对比
    Alpha版
    团队项目第一阶段成果展示
    意见汇总
    团队第一阶段冲刺评价
    冲刺(十)
    【WPF学习】第五十八章 理解逻辑树和可视化树
    【WPF学习】第五十七章 使用代码创建故事板
  • 原文地址:https://www.cnblogs.com/yejiurui/p/2760581.html
Copyright © 2011-2022 走看看