麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > Android > 正文

android使用多線程更新ui示例分享

2020-04-11 11:57:26
字體:
來源:轉載
供稿:網友

Android線程涉及的技術有:Handler;Message;MessageQueue;Looper;HandlerThread。

下面看一段在線程中更新UI的代碼:

復制代碼 代碼如下:

public class MainActivity extends Activity {
private TextView timeLable;
private Button stopBtn;
private Thread mThread;
private boolean isRunning = true;
private int timeCount = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    timeLable = (TextView) findViewById(R.id.timelable);
    stopBtn = (Button) findViewById(R.id.stop);
    stopBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {              
            isRunning = false;
        }
    });

    mThread = new Thread(new Runnable() {

        @Override
        public void run() {
            while (isRunning) {
                try {
                    Thread.sleep(1000);
                    timeCount++;
                    timeLable.setText("timeCount=" + timeCount + " 秒");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }
    });
    mThread.start();       
}
}

這段代碼只是在線程中更新TextView的顯示內容,但是執行后看不到效果,并且報了一個錯:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
在Android中更新UI處理必須由創建它的線程更新,而不能在其他線程中更新。上面的錯誤原因就在于此。

由于timeLable是一個UI控件,它是在主線程中創建的,但是它卻在子線程中被更新了,更新操作在mThread線程的run()方法中實現。這樣的處理違背了Android多線程編程規則,系統會拋出異常。

要解決這個問題,就要明確主線程和子線程的職責。主線程的職責是創建、顯示和更新UI控件、處理UI事件、啟動子線程、停止子線程等;子線程的職責是計算時間和向主線程發出更新UI消息,而不是直接更新UI。子線程向主線程發送消息可以用Handler實現。代碼如下:

復制代碼 代碼如下:

public class MainActivity extends Activity {

private TextView timeLable;
private Button stopBtn;
private Thread mThread;
private boolean isRunning = true;
private int timeCount = 0;

final private Handler mHandler = new Handler(){
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 0 :
            timeLable.setText("timeCount=" + timeCount + " 秒");
            break;
        default :
            break;
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    timeLable = (TextView) findViewById(R.id.timelable);
    stopBtn = (Button) findViewById(R.id.stop);
    stopBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            isRunning = false;
        }
    });

    mThread = new Thread(new Runnable() {

        @Override
        public void run() {
            while (isRunning) {
                try {
                    Thread.sleep(1000);
                    timeCount++;
                    mHandler.sendEmptyMessage(0);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }
    });
    mThread.start();
}
}


運行后不會報之前的錯,TextView也能正常更新內容了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成年免费视频黄网站在线观看 | 泰剧19禁啪啪无遮挡大尺度 | 日本爽快片100色毛片视频 | 成人免费毛片一 | 亚洲啪啪| 亚洲精品午夜在线 | xxxxhd86日本护士hd | 日本在线不卡一区二区 | 56av国产精品久久久久久久 | 伦一区二区三区中文字幕v亚洲 | 久久久久久久免费精品 | 爱操视频 | 日韩精品网站在线观看 | 狠狠干夜夜操 | 中国成人在线视频 | 中文字幕一区二区三区四区 | 久久久久成人免费 | 羞羞答答www网站进入 | 一级电影免费在线观看 | 久久久久久久久日本理论电影 | 色综合久久久久久久粉嫩 | 日本在线播放一区二区三区 | 久久九九热re6这里有精品 | 末成年女av片一区二区 | 黄色片一区二区 | 激情网站免费观看 | 99riav国产在线观看 | 激情久久一区二区 | 色婷婷久久久亚洲一区二区三区 | 国产女做a爱免费视频 | 国产寡妇xxxxxxxx性开放 | 国产视频导航 | 91在线视频观看 | 天天透天天狠天天爱综合97 | 国产成人高潮免费观看精品 | 久久午夜神器 | 成人福利在线播放 | 国产在线精品91 | 久久精品一区二区三区四区五区 | 国产成人精品视频在线 | 在线a|