Android-Handler复习(一)

Android-Handler复习(一)


Handler是面试经常遇到的,至少网上和师兄们都这么说,吓得我赶紧抓紧时间复习这个知识点。
Handler是消息处理机制,用于子线程更新UI操作,如果安卓在子线程更新UI不遵循这种机制的话,
那么就会抛出异常信息。


首先试试不使用Handler机制看看
布局文件

"http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                tools:context="com.xieth.as.handlerdemo.HandlerActivity01"
    >

    "@+id/id_tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:textColor="@android:color/background_dark"
        />

    

一个按钮和一个文本,按钮设置事件改变文本。
主活动.java

package com.xieth.as.handlerdemo;

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

public class HandlerActivity01 extends AppCompatActivity implements View.OnClickListener {

    private Button btn1 = null;
    private TextView tv1 = null;


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


    }

    private void changeFromThread() {
        new Thread(){
            @Override
            public void run() {
                tv1.setText("改变文字了!!");
            }
        }.start();
    }

    private void initViews() {
        btn1 = (Button) findViewById(R.id.id_btn1);
        btn1.setOnClickListener(this);
        tv1 = (TextView) findViewById(R.id.id_tv1);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.id_btn1:
                changeFromThread();
                break;
            default:
                break;
        }
    }
}

可以看到子线程并没有遵循Handler机制
运行:
Android-Handler复习(一)_第1张图片


可以看到的确抛出了异常,那么试试Handler机制

 private void changeFromThread() {
        new Thread(){
            @Override
            public void run() {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        tv1.setText("改变文字了!!");
                    }
                });
            }
        }.start();
    }

运行:
Android-Handler复习(一)_第2张图片
可以看到成功更新UI,并且没有抛出异常。


延迟方法
布局文件增加一个ImageView

"http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                tools:context="com.xieth.as.handlerdemo.HandlerActivity01"
    >

    "@+id/id_tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:textColor="@android:color/background_dark"
        />

    "@+id/id_imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:src="@mipmap/ic_launcher"
        />

    

在主活动增加几个变量

    private ImageView imageView = null;

    private int resId[] = {R.mipmap.pic1, R.mipmap.pic2, R.mipmap.pic3};

    private int index = 0;

    private Handler mHandler = new Handler();

    private MyRunnable myRunnable = new MyRunnable();

自定义一个类用于图片的变化操作

 class MyRunnable implements Runnable {
        @Override
        public void run() {
            index++;
            index %= 3;
            imageView.setImageResource(resId[index]);
            mHandler.postDelayed(myRunnable, 1000);
        }
    }

最后在按钮的设置事件里面开启线程

@Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.id_btn1:
                mHandler.postDelayed(myRunnable, 1000);
                break;
            default:
                break;
        }
    }

运行结果:
Android-Handler复习(一)_第3张图片
很好,装逼成功。。。


既然可以设置这种转换事件,同样也可以进行消除事件。
只需要一行代码即可

case R.id.id_btn2:
   mHandler.removeCallbacks(myRunnable);
   break;

运行:
Android-Handler复习(一)_第4张图片
可以看到点击消除事件,后面就不再进行图片的转换了。


发送消息更新UI

private Handler mHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            tv1.setText("->"+msg.arg1);
        }
    };

然后在事件里面发送消息:

   case R.id.id_btnTv:
     Message message = new Message();
      message.arg1 = 12345;
      mHandler.sendMessage(message);
      break;

运行:
Android-Handler复习(一)_第5张图片


如果从服务器上获取一段网络数据,肯定不是向一个变量那么简单,比如是哈希表或者是
ArrayList这类数据,那么也可以进行传递。
自定义Person类作为数据

class Person {
        public int age;
        public String name;

        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

然后更新UI

 private Handler mHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            tv1.setText(msg.obj.toString());
        }
    };

设置数据

  case R.id.id_btnTv:
    Message message = new Message();
     Person person = new Person(18, "神一样的男人");
     message.obj = person;
     mHandler.sendMessage(message);
     break;

运行:
Android-Handler复习(一)_第6张图片
完全没问题。


记录一下,这只是Handler冰山一角,明天继续复习!

你可能感兴趣的:(Android,复习基础笔记)