安卓Android学习之handler的基础用法

总得来说

Handler的主要用途有两个:(1)、在将来的某个时刻执行消息或一个runnable;(2)把消息发送到消息队列。

先看效果一:延迟一秒改变文字:点击按钮一秒后改变文字

再看效果二:进度条3秒后消失:点击按钮后出现进度条,3秒后消失。

talk is cheap,show me the code:

package mountain_hua.learn1;

import android.app.ProgressDialog;
import android.os.Handler;
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.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private int i = 0;
    private ProgressDialog dlog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView= (TextView) findViewById(R.id.textview);
        Button B1=(Button)findViewById(R.id.button);
        Button B2=(Button)findViewById(R.id.button2);
        
        //改变文字按钮
        B1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ++i;
                //创建新的线程
                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                        doSendMsg();
                    }
                }.start();
            }
        });
        
        //对话框按钮
        B2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dodialog();
            }
        });
    }


    /**
     * 在子线程中做耗时操作,完成之后,通知Handler更新UI
     */
    //发送消息
    private void doSendMsg(){
        try {
            Thread.sleep(1000);//模拟耗时操作1秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Message message = Message.obtain();
        message.arg1 = i;
        message.what = 1;
        myHandler.sendMessage(message);
    }

    //进度条对话框
    private void dodialog(){
        dlog=ProgressDialog.show(MainActivity.this,"测试对话框","3秒后关闭。。。");
        new Thread(){
            @Override
            public void run(){
                super.run();
                try {
                    Thread.sleep(3000);//模拟耗时操作3秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Message message=Message.obtain();
                message.arg1=0;
                message.what=2;
                myHandler.sendMessage(message);
            }
        }.start();
        /*如果把子线程中这段语句剪切至这里,就变成主线程中的语句了,
        myhander会直接接收到消息,进度条对话框直接消失甚至不出现,不会有3秒延迟。
        Message message=Message.obtain();
                message.arg1=0;
                message.what=2;
                myHandler.sendMessage(message);
        *
        * */
    }

    Handler myHandler = new Handler(){
        /**
         * handleMessage接收消息后进行相应的处理
         */
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==1){
                //改变TextView
                textView.setText(msg.arg1+"");
            }
            else if(msg.what==2){
                //使对话框消失
                Toast.makeText(MainActivity.this,"测试成功",Toast.LENGTH_SHORT).show();
                dlog.dismiss();
            }
        }
    };

}

猜你喜欢

转载自blog.csdn.net/mountain_hua/article/details/80548784