1. 程式人生 > >進度條與子執行緒訪問主執行緒

進度條與子執行緒訪問主執行緒

1.進度條(ProgressBar) 進度條的屬性: style=”?android:attr/progressBarStyleHorizontal” 預設為圓形 android:progress=”33” 進度條進行到的當前位置(去activity中動態載入) android:max=”100” 進度條的最大長度為 100 這裡寫圖片描述 2 執行緒注意事項: 不能在主執行緒中執行耗時的操作,只能在子執行緒中操作 另外,在子執行緒中不能操作主執行緒中的控制元件(ProgressBar除外

解決辦法用Handler: Handler:用於執行緒之間的通訊,比如:主執行緒與子執行緒 3:案例 點選下載按鈕,進度條以及進度條的百分比動態改變 (1)首先在activity中弄一個Button,一個TextView,一個ProgressBar 並且給按鈕新增一個點選事件set (2) 然後在MainActivity.java中實現方法

package com.basic.t212_a05;

import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast;

public class MainActivity extends AppCompatActivity { private ProgressBar ptn_main_ptn1; private int progress; private TextView tv_main_tv1; private int code = 1; private myHandler myHandler = new myHandler(); private class myHandler extends Handler{ @Override //通過handler去執行主執行緒中的操作 public void handleMessage(Message msg) { super.handleMessage(msg); if(code==msg.what){ progress++; ptn_main_ptn1.setProgress(progress); tv_main_tv1.setText(progress + “%”); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //根據id找到對應的控制元件 ptn_main_ptn1 = this.findViewById(R.id.ptn_main_ptn1); tv_main_tv1 = this.findViewById(R.id.tv_main_tv1); }

public void set(View view) {
    if(0 == progress){
        new myThread();
    }
}

private class myThread extends Thread{
    @Override
    public void run() {
        super.run();
        while(true){
            try {
                Thread.sleep(100);//執行緒休眠
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //如果進度條載入到100就歸0並停止執行 
            if(progress == 100){
                progress=0;
                break;
            }
            progress++;
            ptn_main_ptn1.setProgress(30);
            Message msg = new Message();
            msg.what = 1;//指定的執行緒
            myHandler.sendMessage(msg);
        }
    }
}

} 4:執行緒小結 SubThread->MainThread 錯誤 SubThread->Handler->MainThread 正確