Android异步加载数据更新UI(Thread+Handler)

目录:
    1.异步加载应用场景+概述
    2.Thread+Handler和AsyncTask实现异步对比
    3.Thread+Handler异步加载图片(Demo)

1.异步加载应用场景+概述
    异步加载主要应用于处理需要处理比较耗时的操作,有需要更新UI的场景,比如异步请求网络获取图片,或者其他数据时使用,好处
    是在执行耗时操作时不影响用户的UI操作

2.Thread+Handler和AsyncTask实现异步对比
    2.1)Thread+Handler
        优点:处理多个异步任务是显得比较清晰,简洁
        缺点:处理单个异步线程任务的时候就有点臃肿了
            
    2.2)AsyncTask
        优点:处理单个异步线程任务是显得简单,更轻量级
        缺点:比Thread+Handler耗时,处理多个异步任务是就会变得很复杂

3.Thread+Handler异步加载图片(Demo)
    3.1)线程类DownloadImgThread.java
package com.example.thread;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Created by elimy on 2016-09-09.
 */
public class DownloadImgThread extends Thread {
    //图片链接地址
    private String image_url;
    //UI线程中传递的参数用于向UI线程传递消息和数据
    private Handler mHandler;
    //获取成功massage
    private int SUCCESS_MSG = 1;
    //获取失败返回massage
    private int FAILURE_MSG = 0;
    /*
    * 带参构造方法
    * */
    public DownloadImgThread(String image_url, Handler mHandler) {
        this.image_url = image_url;
        this.mHandler = mHandler;
    }
    /*
    * 继承重写Thread的方法
    * 实现异步请求图片
    * */
    @Override
    public void run() {
        try {
            URL url =new URL(image_url);
            //获取链接对象
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            //设置请求方式
            urlConnection.setRequestMethod("GET");
            //设置可接受输入
            urlConnection.setDoInput(true);
            //设置超时时间
            urlConnection.setConnectTimeout(5*1000);
            //根据状态码判断是否请求成功
            if (urlConnection.getResponseCode() == 200){
                //获取响应输入流
                InputStream is=urlConnection.getInputStream();
                //将图片流转换成位图类型
                Bitmap bitmap= BitmapFactory.decodeStream(is);

                /*
                与下面效果相同
                Message msg = mHandler.obtainMessage();
                msg.obj = bitmap;
                msg.arg1 = SUCCESS_MSG;
                mHandler.sendMessage(msg);
                */

                //obtainMessage(int what, Object obj)
                //what:表示参数
                //Object:返回数据对象
                mHandler.obtainMessage(SUCCESS_MSG,bitmap).sendToTarget();

            }else {
                //获取图片失败返回失败massage
                mHandler.obtainMessage(FAILURE_MSG).sendToTarget();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

   
    3.2)主布局类MainActivity.java
package com.example.thread;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.example.R;

public class MainActivity extends AppCompatActivity {
    private ImageView imageView;
    private Button button;
    private DownloadImgThread mThread;
    private String image_url ="http://pic43.nipic.com/20140708/4481651_113707494582_2.jpg";
    private Handler mHandler;
    private final String DEBUG = "debug";
    Handler mHandler2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        imageView = (ImageView) findViewById(R.id.imageView);
        button = (Button) findViewById(R.id.button);

        //初始化handler,并实现回传数据接收和UI更新
        mHandler = new Handler(){
            //继承实现Handler的handleMessage方法,该方法在UI线程中执行
            @Override
            public void handleMessage(Message msg) {
                //根据线程回传的的表示信息做相应的UI处理
                switch (msg.what){
                    case 1:
                        //设置图片数据到UI显示
                        imageView.setImageBitmap((Bitmap) msg.obj);
                        Log.d(DEBUG,msg.getTarget().toString());
                        break;
                    case 0:
                        Toast.makeText(MainActivity.this,"获取图片失败",Toast.LENGTH_SHORT).show();
                        Log.d(DEBUG,"获取图片失败");
                        break;
                }

            }
        };
        //设置监听
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过带参构造方法实现自定义图片异步加载线程类的初始化
                 mThread = new DownloadImgThread(image_url,mHandler);
                //启动线程
                mThread.start();
            }
        });

    }
}     
     
    3.3)布局文件activity_main.xml




    

    
   

    3.4)效果截图

Android异步加载数据更新UI(Thread+Handler)_第1张图片

你可能感兴趣的:(android)