Android 线程之Thread

0x0 前言
在Android中如何声明和管理线程呢?至少存在以下几种方式:
1.使用Thread类;2.使用抽象的AsyncTask类;3.Handler类
0x1 概述
Android应用程序从主线程开始执行,也就是UI线程。如果不启动启动另外的线程,Android中所有操作都在UI线程中进行,也就是说在UI线程中进行耗时操作时,会阻塞UI线程,直到操作完成。一般会造成应用程序无响应(ANR,一般5秒五无响应,系统就会退出当前程序),这样的用户体验一定不够好。有两个原则一定要遵循:不要阻塞UI线程,不要再UI线程之外的地方更新视图。
0x3使用Thread类

public class MyThread implements Runnable {
    private Activity mActivity;

    public MyThread(Activity mActivity) {
        this.mActivity = mActivity;
    }

    @Override
    public void run() {

        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                ((ProgressBar) mActivity.findViewById(R.id.progressBar1))
                        .setProgress(50);
                ;

            }
        };
        mActivity.runOnUiThread(runnable);
    }

}

我们注意到,当我们更新UI时,我们首先创建了一个新的Runable对象。假如上面的代码我们做一下修改,如下:

public class MyThread implements Runnable {
    private Activity mActivity;
    private int mProgress;

    public MyThread(Activity mActivity) {
        this.mActivity = mActivity;
    }

    @Override
    public void run() {

        mProgress = 0;
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                mActivity.findViewById(R.id.progressBar1).setVisibility(
                        View.VISIBLE);
                ((ProgressBar) mActivity.findViewById(R.id.progressBar1))
                        .setProgress(0);
                ;

            }
        };
        mActivity.runOnUiThread(runnable);

        for (int i = 0; i < 100; i++) {
            SystemClock.sleep(500);
            runnable = new Runnable() {

                @Override
                public void run() {
//                  ((ProgressBar) mActivity.findViewById(R.id.progressBar1))
//                          .setMax(++mProgress);
                    ((ProgressBar) mActivity.findViewById(R.id.progressBar1)).setProgress(++mProgress);
                }
            };
            mActivity.runOnUiThread(runnable);
        }

        runnable = new Runnable() {

            @Override
            public void run() {
                Toast.makeText(mActivity, "Test Over", Toast.LENGTH_LONG).show();

            }
        };

        mActivity.runOnUiThread(runnable);
    }

}

这样的代码肯定是不好的,每次更新UI都创建Runable对象,造成不必要的垃圾回收。开发者一定要避免这样的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值