Android基础积累——Handler介绍

Handler介绍:

  Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。这种机制通常用来处理相对耗时比较长的操作。下面从最简单的使用开始。

Handler使用(一)

  1、点击开始线程按钮会启动线程更改文本框中的文本,点击结束按钮则将线程结束,更新文本提示。  

  2、MainActivity代码及解释

package hlf.com.handlerdemo;

import android.content.SyncStatusObserver;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private Button btnstart;
    private Button btnend;
    //创建Handler对象
    Handler handler = new Handler();
    //创建新的线程对象
    Runnable updateThread = new Runnable() {
        //执行任务方法
        @Override
        public void run() {
            int i=0;
            i++;
            //修改textview文本
            textView.setText("线程启动" + i);
            //将执行的线程放入队列中,等待时间结束,运行其他指定线程对象
            //updateThread当前线程
            //3000延迟时间
            handler.postDelayed(updateThread,3000);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text_view);
        btnstart = (Button) findViewById(R.id.btn1);
        btnstart.setOnClickListener(new StartClickListener());
        btnend = (Button) findViewById(R.id.btn2);
        btnend.setOnClickListener(new EndClickListener());
    }
    //启动按钮监听事件
    private class StartClickListener implements View.OnClickListener{
        //调用Handler的post()方法,将要执行的线程对象放到队列当中
        @Override
        public void onClick(View v) {
            handler.post(updateThread);
        }
    }
    private class EndClickListener implements View.OnClickListener{
        ////调用Handler的removeCallbacks()方法,删除队列当中未执行的线程对象
        @Override
        public void onClick(View v) {
            //删除线程中的指定对象
            handler.removeCallbacks(updateThread);
            textView.setText("线程停止");
        }
    }
}

  3、布局很简单,只有按钮跟TextView

 <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:text="@string/tview"
        android:textSize="20dp"
        />
    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btntextstart"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn2"
        android:text="@string/btntextend"/>

Handler使用(二)

  1、点击按钮,进度条更新

  

  2、MainActivity,将显示、判断进度条和移除进程代码放在handleMessage方法中,不能放在Runnable中

package hlf.com.hander2;

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.ProgressBar;

public class MainActivity extends AppCompatActivity {

    private ProgressBar progressBar;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progressBar = (ProgressBar)findViewById(R.id.progressBar);
        button = (Button)findViewById(R.id.button);
    }

    private class StartOnClickListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            //显示进度条
            progressBar.setVisibility(View.VISIBLE);
            //讲进程放入队列
            handler.post(runnable);

        }
    }
    Handler handler = new Handler(){
        //Runnable接受信息
        @Override
        public void handleMessage(Message msg) {
            //显示进度条
            progressBar.setProgress(msg.arg1);
            if (msg.arg1<=progressBar.getMax()){
                handler.post(runnable);
            }else {
                handler.removeCallbacks(runnable);
            }
        }
    };
    
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            int i = 0;
            i += 10;
            //获得一个消息队列
            Message message = handler.obtainMessage();
            ///设置消息
            message.arg1 = i;
            try {
                //延时1秒
                Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            //发送消息给消息队列
            handler.sendMessage(message);
        }
    };
}

  3、布局文件

 <ProgressBar
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/progressBar" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始"
        android:id="@+id/button" />

  4、进度条种类 详细解释请看 Android简单自定义圆形和水平ProgressBarhttp://blog.csdn.net/mad1989/article/details/38042875

  • Widget.ProgressBar.Horizontal 横向的
  • Widget.ProgressBar.Small 小圆圈
  • Widget.ProgressBar.Large
  • Widget.ProgressBar.Inverse
  • Widget.ProgressBar.Small.Inverse
  • Widget.ProgressBar.Large.Inverse

 

posted on 2016-04-06 10:54  Huang路飞  阅读(98)  评论(0)    收藏  举报

导航