FC 10.2 多线程编程及Handler消息异步处理机制

  • 线程的基本用法
  • 在子线程中更新UI
    • Handler消息异步处理机制
    • Handler消息异步处理个人理解

线程用于执行比较耗时的操作。

线程的基本用法有三个(常用第三种)

1、新建类继承Thread,重写父类的run()方法,在里边执行对应的逻辑。使用时,new这个类的实例,调用start()方法。

class MyThread extends Thread {
    @Override
    public void run() {
        //添加事件
    }
}


//使用时:
MyThread s = new MyThread();
s.start();

2、新建类实现Runnable接口,实现run()方法。(启动线程时,与第一种方式不同)

class myThread implements Runnable{
    @Override
    public void run() {
     //添加事件   
    }
}

//使用时
MyThread myThread = new MyThread();
new Thread(myThread).start();

3、不想创建类,可以使用匿名内部类的方式。(常用)

new Thread(new Runnable() {
    @Override
    public void run() {
        //添加事件
    }
}).start();

在子线程中更新UI

Android的UI是线程不安全的,即要想改变UI中的元素,必须在主线程中操作,否则就会出现异常。

解决方案:使用Handler消息异步处理机制。

  1. 定义UPDATE_TEXT常量用于表示更新textview的动作
  2. 新增一个Handler对象,重写父类的handleMessage()方法,这里对具体的message进行处理(如我们要修改textview的文字)
  3. 按钮的单击事件:新建一个子线程,创建Message对象,将what字段设置为UPDATE_TEXT,然后调用handler的sendMessage方法。
  4. (Handler接收到这条message,对携带的what值进行判断,进而进行UI操作)
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final int UPDATE_TEXT = 1;
    private Button btn;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn);
        textView = (TextView) findViewById(R.id.textview);
        btn.setOnClickListener(this);
    }
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPDATE_TEXT:
                    textView.setText("我被更改了!");
                    Toast.makeText(getApplicationContext(), "我被更改了", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };
    @Override
    public void onClick(View v) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = UPDATE_TEXT;
                handler.sendMessage(message);
            }
        }).start();
    }
}

Handler消息异步处理个人理解

我个人是这么理解的:教室里有相应的规章制度,教室外边的人A不能修改教室里边的规章制度,但是A可以找一个线人来帮忙,A告诉线人,让线人告诉教室里的人,然后教室里的人就可以修改规章制度了。(个人理解,如有错误,不啬赐教!严肃脸.jpg)

猜你喜欢

转载自blog.csdn.net/easy_purple/article/details/84260411
今日推荐