Android课程——HTTP请求之图片加载(二)

本文介绍如何在Android应用中使用HTTP加载并显示图片,包括在布局中设置图片及通过HTTPConnection方法请求下载网络图片的步骤。强调了HTTPConnection请求下载时的响应码检查以及代码复用性的重要性。
用HTTP加载图片在屏幕上显示

layout代码

<Button
        android:id="@+id/eeee_download"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:textSize="30sp"
        android:text="点击下载"
        />
    <ImageView
        android:id="@+id/eeee_downloadimg"
        android:layout_below="@+id/eeee_download"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

MainActivity 代码


public class MainActivity extends AppCompatActivity {
    Button btn1;
    ImageView img1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindID();
    }

    private void bindID() {
        btn1 = findViewById(R.id.eeee_download);
        img1 = findViewById(R.id.eeee_downloadimg);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建一个方法DownloadTask
                ImageLoadTask task = new ImageLoadTask(MainActivity.this, btn1, img1);
                task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg");
            }
        });
    }
}

ImageLoadTask


//外部类,可以复用
//第一个参数用String,因为传值需要用execute,是String类型的
public class ImageLoadTask extends AsyncTask<String, Integer, Bitmap> {
    private Context context;
    private Button btn;
    private ImageView img;
    //加载网络图片需要用到Bitmap对象
    private Bitmap bitmap;

    //在外面单独创建一个类,需要一个构造方法来调用。
    //为什么需要构造方法——有传值的需求
    public ImageLoadTask(MainActivity mainActivity, Button btn, ImageView img) {
        this.context = mainActivity;
        this.btn = btn;
        this.img = img;
    }

    @Override
    protected Bitmap doInBackground(String... strings) {
        //加载网络图片,最后获得一个Bitmap对象,返回Bitmap对象
        try {
            //创建URL对象,
            // 接收的对象是task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg");
            URL url = new URL(strings[0]);
            //通过URL对象得到HttpURLConnection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //得到输入流
            InputStream inputStream = connection.getInputStream();
            //把输入流转换成Bitmap类型对象
            bitmap = BitmapFactory.decodeStream(inputStream);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        img.setImageBitmap(bitmap);

    }
}

注意:创建外部类的好处是代码的复用性。

用HTTPConnection方法请求下载网络图片并下载

layout布局文件:


    <Button
        android:id="@+id/eigthbtn"
        android:textSize="30sp"
        android:text="点击下载"
        android:layout_width="match_parent"
        android:layout_height="80dp" />

    <ImageView
        android:id="@+id/eigthimg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

Main8Activity代码:

public class Main8Activity extends AppCompatActivity {
    private Button btn;
    PermissionHelper permissionHelper;
    private ImageView img;
    private String picUrl="http://img03.sogoucdn.com/app/a/100520093/9243fbcd523532c7-65a10dc900adf004-16cb2e34a14409c94f53ee8772786500.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main8);
        btn=findViewById(R.id.eigthbtn);
        img=findViewById(R.id.eigthimg);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                permissionHelper=new PermissionHelper(Main8Activity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
                permissionHelper.request(new PermissionHelper.PermissionCallback() {
                    @Override
                    public void onPermissionGranted() {
                        //获取到了权限
                        Task8 task8=new Task8(Main8Activity.this,img);
                        task8.execute(picUrl,"2qw7.jpg");

                    }

                    @Override
                    public void onIndividualPermissionGranted(String[] grantedPermission) {

                    }

                    @Override
                    public void onPermissionDenied() {

                    }

                    @Override
                    public void onPermissionDeniedBySystem() {

                    }
                });


            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(permissionHelper!=null){
            permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);

        }
    }
}

需要继承AsyncTask的外部类:


public class Task8 extends AsyncTask<String,Integer,Integer> {
    private String dirPath;//下载图片目录,例如/root/pic/
    private String filePath;//文件存储具体位置
    private Context context;
    private ImageView img;


    public Task8(Context context, ImageView img) {
        this.context=context;
        this.img=img;
    }



    @Override
    protected Integer doInBackground(String... strings) {
      //文件名传参
        String fileName=strings[1];

        //搜寻外部目录
        dirPath= Environment.getExternalStorageDirectory()+"/"+"down_pics/";
        //创建目录对象是否存在
        File dir=new File(dirPath);
        if(!dir.exists()){
            //新建目录
            dir.mkdir();
        }

        //判断文件是否存在
        filePath=dirPath+strings[1];
        File file=new File(filePath);
        if(file.exists()){
            return -1;
        }
        else {
            try {
                //文件不存在的话创建文件
                file.createNewFile();


            } catch (IOException e) {
                e.printStackTrace();
            }
        }


        /*****/
        //文件输入输出流
        InputStream inputStream=null;
        FileOutputStream outputStream=null;


        try {
            URL url=new URL(strings[0]);
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                //判断返回码是否正确,若正常就创建输入流,若不正常则返回
            if(connection.getResponseCode()==200){
                inputStream=connection.getInputStream();
            }else {
                return -2;
            }
        //输出流
            outputStream=new FileOutputStream(file);
            //每次存储的长度
            int length=0;
            //缓存区
            byte[] buffer=new byte[4*1024];
            //判断是否能连接网络
            while ((length=inputStream.read(buffer))!=-1){
                outputStream.write(buffer,0,length);
            }
            //冲刷缓存区
            outputStream.flush();
            //关闭输入输出流
            outputStream.close();
            inputStream.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        return 1;
    }

    /****/
    //
    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);

        switch (integer){
            case 1:
                //正常下载完成
                Toast.makeText(context,"下载完成",Toast.LENGTH_SHORT).show();
                Bitmap bmg= BitmapFactory.decodeFile(filePath);
                img.setImageBitmap(bmg);
                break;
            case -1:
                Toast.makeText(context,"文件已存在",Toast.LENGTH_SHORT).show();
                break;
            case -2:
                Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

注意:
Environment.getExternalStorageDirectory():内置SD卡环境;
getResponseCode():客户端发出请求,如果连接成功,就会有响应码code,如果code=200,说明服务器端成功响应。如果在Android4.x中,即使连接成功,响应码为空,不提示任何错误;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值