Android-handler.post和handlemessage的使用对比(下载图片)

1、网络权限:

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

2、布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imgview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerInside"
        android:src="@mipmap/ic_launcher" />

</RelativeLayout>

3.1、使用sendmessage方法下载图片

可加进度条、sendMessage(Message)

package com.example.administrator.downloadimage;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/**
 * Created by Administrator on 2017/5/4.
 */

public class HandleMessageActivity extends AppCompatActivity {

    private ImageView imgview;
    private ProgressDialog pDialog;
    private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";

    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case 0:
                    pDialog.show();
                    break;
                case 1:
                    imgview.setImageBitmap((Bitmap) msg.obj);
                    break;
                case 2:
                    pDialog.dismiss();
                    break;
            }
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main1);

        imgview = (ImageView) this.findViewById(R.id.imgview);
        pDialog = new ProgressDialog(this);        //下载提示对话框
        pDialog.setIcon(R.mipmap.ic_launcher);
        pDialog.setTitle("提示");
        pDialog.setMessage("The picture is loading...");

        new Thread(new Runnable() {    //主线程中用Thread开辟子线程,Runnable只是一个接口

            @Override
            public void run() {
                // 1 发送空消息,显示进度对话框
                handler.sendEmptyMessage(0);

                // 2 下载操作
                byte[] data = download(url);
                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

                Message message = Message.obtain();    //创建信息
//尽管Message有public的默认构造方法,
// 但是应该通过Message.obtain()来从消息池中获得空消息对象,以节省资源。
// 通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销了。
                message.obj = bitmap;
//如果你的message只需要携带简单的int信息,
// 请优先使用Message.arg1和Message.arg2来传递信息,这比用Bundle更省内存.
                message.what = 1;
//擅用message.what来标识信息,以便用不同方式处理message。

                handler.sendMessage(message);// 关键方法:sendMessage

                // 3 发送空消息,关闭进度对话框
                handler.sendEmptyMessage(2);
            }

        }).start();
    }

    public byte[] download(String url) {
        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(url);
            HttpResponse response = client.execute(get);

            if (response.getStatusLine().getStatusCode() == 200) {
                return EntityUtils.toByteArray(response.getEntity());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3.2 使用post下载图片

: post(Runnable)


package com.example.administrator.downloadimage;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ImageView;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/**
 * Created by Administrator on 2017/5/4.
 */

public class HandlerPostActivity extends AppCompatActivity {

    private ImageView imgview;
    private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
    private Handler handler = new Handler();

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

        imgview = (ImageView) this.findViewById(R.id.imgview);

        // 工作线程
        new Thread(new Runnable() {

            @Override
            public void run() {// 子线程:下载数据
                Log.i("MainActivity", "first:" + Thread.currentThread().getName());
                //获取当前线程的名字

                // 下载数据
                byte[] data = download(url);
                final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

                // handler与绑定的主线程提交一个任务
                handler.post(new Runnable() {// 关键方法:post

                    @Override
                    public void run() {// 主线程:更新UI
                        Log.i("MainActivity", "second:"
                                + Thread.currentThread().getName());
                        imgview.setImageBitmap(bitmap);
                    }
                });
            }
        }).start();
    }

    public byte[] download(String url) {    //下载方法
        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(url);
            HttpResponse response = client.execute(get);

            if (response.getStatusLine().getStatusCode() == 200) {
                return EntityUtils.toByteArray(response.getEntity());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值