Android学习记录:线程

北慕城南 提交于 2020-03-31 02:16:20

在Java中,线程的建立方法如下。
新建一个类,接口Runnable,重载 run方法

import javax.swing.JTextField;

public class test implements Runnable{
    @Override
    public void run() {
    }
}

在需要开始这个线程的地方,这样创建线程

private Thread th;
test te = new test();
th = new Thread(te);
th.start();

Java中调用线程的时候,可以直接访问JFrame上的组件,并更改其值,但是在安卓中,如果一个子线程涉及到UI更新,Android主线的线程是不安全的。更新UI只能在主线程中更新。
所以要把Message通过handler来send,然后利用callback来接收。

新建类,接口Callback
重载的handleMessage中就是对从子线程中传入的Message做处理。

import android.os.Handler.Callback;
import android.os.Message;
import android.widget.TextView;

public class CB implements Callback{
    private TextView tv;
    public TextView getTv() {
        return tv;
    }
    public void setTv(TextView tv) {
        this.tv = tv;
    }
    @Override
    public boolean handleMessage(Message msg) {
        int number = msg.arg1;
        tv.setText("Test "+number);
        return true;
    }
}

实例化Handler对象,利用传入Callback对象的构造方法

Handler handler = new Handler(cb);

构造类,接口Runnable ,并传入Handler。
创建Message对象,给其两个参数赋值。利用Handler传出参数。
其中int类的message用来实现线程虚拟挂起的功能(运行死循环,但是不对参数进行改变)

import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class Number implements Runnable{

    private TextView tv;
    private Handler handler;
    private int message = 0;


    public int getMessage() {
        return message;
    }

    public void setMessage(int message) {
        this.message = message;
    }

    public Handler getHandler() {
        return handler;
    }

    public void setHandler(Handler handler) {
        this.handler = handler;
    }

    public TextView getTv() {
        return tv;
    }

    public void setTv(TextView tv) {
        this.tv = tv;
    }

    @Override
    public void run() {
        int i = 0;
        while(true){
            if(message == 1){
                continue;
            }else{
                i++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Message msg = new Message();
            msg.arg1 = i;
            handler.sendMessage(msg);
        }
        }
    }

}

所以,利用线程同时需要更新ui的话,构造顺序如下。
1.实例化接入了Callback的类,cb;
2.实例化接入了Runnable的类,num;
3.实例化Handler,利用传入Callback的构造方法;
4.cb中传入要更新的view;
5.num中传入message(挂起用);
6.num中传入handler;
7.start;

主Activity如下

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
    private int flag = 0;
    private Number num;
    private Thread th;
    private TextView tv;
    private CB cb;
    private Handler handler;
    private Button bu;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void Start(View v) {
        if (flag == 0) {
            num = new Number();
            th = new Thread(num);
            tv = (TextView)this.findViewById(R.id.Text);
            cb = new CB();
            cb.setTv(tv);
            bu = (Button) this.findViewById(R.id.button);
            handler = new Handler(cb);
            num.setHandler(handler);
            num.setTv(tv);
            num.setMassage(0);
            th.start();
            bu.setText("Stop");
            flag = 1;
        } else if (flag == 1) {
            bu.setText("Start");
            num.setMassage(1);
            flag = 2;
        } else if( flag == 2){
            bu.setText("Stop");
            num.setMassage(0);
            flag = 1;
        }   
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!