Android基础学习之Thread(线程)

进程和线程
进程:android应用程序的生命周期,由线程组成.
进程之间是独立的,通常叫不同的应用.
任何一个进程内部还有一个线程没有结束,那么这个进程没有结束。
任何一个应用都有一个主线程

java的并发基于线程的。
android 线程编程
相同:基于java来定义线程的
不同:基于linux os 来实现并发,主线程不同于java主线程
android 主线程也叫UI线程,它负责处理和UI相关的事件。

android UI线程(主线程)是单线程模型的特点:
1.当UI线程被阻塞时,超时会弹出ANR对话框。(Do not block the UI thread)
2.在UI线程以外的子线程不能访问UI对象,否则异常终止

示例:
1.xml布局
这里写图片描述

2.java代码

public class MainActivity extends Activity implements OnClickListener {

    private Button btn1;
    private Button btn2;
    private TextView tView1;
    private TextView tView2;
    private TextView tView3;
    private Button btn3;

    private boolean active = false;//子线程活动标识位
    int cnt1, cnt2, thread_cnt;

    //使用Handler进行信息的接收和处理
    class Myhandler extends Handler {
        @Override
        // 接收消息
        public void handleMessage(Message msg) {
            //更新UI
            // 方法1
            // t1.setText(String.valueOf(msg.what));
            // 方法2
            if (msg.what == 123) {
                tView1.setText(String.valueOf(msg.arg1));
                setTitle(msg.obj.toString() + msg.arg1);
            }
        }
    }

    Myhandler handler = new Myhandler();

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

        btn1 = (Button) findViewById(R.id.button1);
        btn2 = (Button) findViewById(R.id.button2);
        btn3 = (Button) findViewById(R.id.button3);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);

        tView1 = (TextView) findViewById(R.id.textView1);
        tView2 = (TextView) findViewById(R.id.textView2);
        tView3 = (TextView) findViewById(R.id.textView3);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            test1();//测试1,一个应用程序可以有无数个子线程,而不互相影响
            break;
        case R.id.button2:
            test2();//测试2,对UI线程的操作不会影响子线程
            break;
        case R.id.button3:
            test3();//测试3,使用异步延时,达到更新UI而不阻塞主线程
            break;

        default:
            break;
        }
    }

    private void test3() {
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                Log.d("QL debug", ">>>>" + Thread.currentThread());
                tView3.setText("boom,boom,boom......../.");
            }
        }, 5000);// 延迟5秒不会阻塞主线程 (异步延迟)
        Log.d("QL debug", ">>>> test3() over.");
    }

    private void test1() {
        thread_cnt++;
        setTitle("应用创建了:" + thread_cnt + "个子线程");

        new Thread() {
            public void run() {
                active = true;
                while (active) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    cnt1++;
                    // 发送消息
                    // 方法1
                    // handler.sendEmptyMessage(cnt1);

                    // 方法2 比new更好
                    Message msg = handler.obtainMessage();
                    msg.what = 123;
                    msg.arg1 = cnt1;
                    msg.obj = "I come from sub thread world";
                    // handler.sendMessage(msg);//发送信息方式1
                    msg.sendToTarget();//发送信息方式2
                }
            }

        }.start();
    }

    private void test2() {
        cnt2++;
        tView2.setText(String.valueOf(cnt2));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        active = false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值