Handler异步消息处理

耗时操作不能在主线程完成,必须要在子线程完成但是子线程不能更新UI所以我们可以用Handler
Handler里有一个队列,先进入的先出,发一下消息就执行一次
Handler的定义:
主要接受子线程发送的数据,并用此数据配合主线程更新UI

使用Handler

new Handler().postDelayed(new Runnable(){
                    @Override
                    public void run() {
                        Log.e("延时两秒","延时两秒检索");
                        mRecycle_view.onRefreshComplete();
                    }
                }, 3000);
            }

还可以

package com.example.handler_text;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {
//  1,创建Handler
public Handler mHandler=new Handler(){
//  2,重写handleMessage方法
    public void handleMessage(Message msg){
        switch(msg.what){//判断那个消息
        case 1:
            Log.e("tag", "333"+msg.obj);//更新UI
            break;
        }
    }
};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //耗时操作用分线程
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String name="小明";
                Message message = mHandler.obtainMessage();
                message.obj=name;
                message.what=1;//用来辨识消息的编号
//              mHandler.sendMessage(message);  //发送消息
//              mHandler.sendEmptyMessage(123);//空发送,传入编号
                mHandler.sendEmptyMessageDelayed(200, 5000);//空延迟发送
            }
        }).start();
        
    }
}

还可以用runOnUiThread

new Thread() {//创建子线程
                    public void run() {
                        for (int i = 0; i < int1; i++) {
                            try {
                                // 休息一会
                                Thread.sleep(500);//每循环一次就睡一毫秒
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }

                        // 不能在分线程里面直接更新UI
                        // runOnUiThread返回到主线程执行
                        runOnUiThread(new Runnable() {
                            public void run() {
                                animationDrawable.stop();//停止动画
                                current = animationDrawable.getCurrent();//获得当前帧的图片
                            }
                        });
                    };
                }.start();

还可以用单个Handler发送空的延迟来更新UI

public Handler mHandler=new Handler(){
    //  2,重写handleMessage方法
        public void handleMessage(Message msg){
            animationDrawable.stop();//停止动画
            current = animationDrawable.getCurrent();//获得当前帧的图片
            }
        
    };
    mHandler.sendEmptyMessageDelayed(2, int1*180);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容