自由编码(获取网络图片)(虽然写出来了,但是感觉没有完全按照任务要求2(2)那个要求不知道怎么实现)

来源:4-3 自由编程

曾经的曾经去哪了

2018-08-28 12:33:04


package com.studio.myapplication;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

   private static final int DOWNLOAD_FAILED = 10086;
   private static final int DOWNLOAD_SUCCESS = 74110;
   private Button bt;
   private ImageView iv;
   private String path="https://img2.mukewang.com/5adfee7f0001cbb906000338-240-135.jpg";
   private Bitmap bitmap;

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

       initView();
   }

   
   private void initView() {
       bt= (Button) findViewById(R.id.bt);
       iv= (ImageView) findViewById(R.id.iv);

       bt.setOnClickListener(this);
   }

   @Override
   public void onClick(View v) {
       switch (v.getId()){
           case R.id.bt:
               GetPicThread gg=new GetPicThread();
               new Thread(gg).start();
               break;
       }
   }

   private class GetPicThread implements Runnable{
       private mHandler hander=new mHandler(MainActivity.this);
       @Override
       public void run() {
           try {
               URL url=new URL(path);
               HttpURLConnection connection= (HttpURLConnection) url.openConnection();

               connection.setConnectTimeout(10*1000);

               connection.setRequestMethod("GET");
               if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){
                   InputStream inputStream=connection.getInputStream();
                   Bitmap bm= BitmapFactory.decodeStream(inputStream);
                   Message message=Message.obtain();
                   message.obj=bm;
                   message.what=bm==null?DOWNLOAD_FAILED:DOWNLOAD_SUCCESS;
                   hander.sendMessage(message);
               }

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



   public class mHandler extends Handler{
       public final WeakReference<MainActivity> mWeakReference;

       public mHandler(MainActivity activity) {
           this.mWeakReference = new WeakReference<>(activity);
       }


       @Override
       public void handleMessage(Message msg) {
           super.handleMessage(msg);
           MainActivity activity=mWeakReference.get();

           switch (msg.what){
               case DOWNLOAD_SUCCESS:
                   activity.bitmap= (Bitmap) msg.obj;
                   activity.iv.setImageBitmap(activity.bitmap);
                   break;
           }
       }
   }
}

写回答

1回答

irista23

2018-08-28

能够使用Thread开启子线程下载图片,通过handler将图片显示到主线程,并且还是用了软引用避免内存泄漏,程序结果符合题目效果要求。任务2中是要添加一个GetPicThread类的构造方法,将path和handler通过构造方法传进来,再获取图片后封装Message,再通过handler将消息发送给UI主线程。

0

0 学习 · 1613 问题

查看课程