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對象,造成不必要的垃圾回收。開發者一定要避免這樣的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章