1. 程式人生 > >Android studio 進度條

Android studio 進度條

在我們使用進度條 ProgressBar的時候
它的常用屬性為:
進度條預設為圓形 ,但是我們這裡使用是線型
style="?android:attr/progressBarStyleHorizontal"
android:progress=“33”
android:max=“100”

執行緒休眠
Thread.sleep(100);//拋異常
SystemClock.sleep(100);//不會拋異常

public class MainActivity extends AppCompatActivity {

    private ProgressBar pb_main_pb1;
    private int progress;
    private TextView tv_main_tv1;
    private MyHandler myHandler = new MyHandler();



    private int code = 1;
    private class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if(code == msg.what){
                progress ++;
                pb_main_pb1.setProgress(progress);
                tv_main_tv1.setText(progress+"%");
            }

        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pb_main_pb1 = this.findViewById(R.id.pb_main_pb1);
        tv_main_tv1 = this.findViewById(R.id.tv_main_tv1);
    }

    public void studyToast(View view) {
        Toast.makeText(this, "hello Toast", Toast.LENGTH_LONG).show();


    }


    public void setProgressBar(View view) {
          if(0 == progress){
              new MyThread().start();
          }

    }

    private class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
            while (true){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(progress == 100){
                    progress =0;
                    break;
                }

                Message msg = new Message();
                msg.what = 1;
                myHandler.sendMessage(msg);


            }


        }
    }


}

執行緒注意事項:
我們在操作 (ProgressBar除外) 控制元件時如果把控制元件放在子執行緒裡就會出問題,所以我們這裡通過MyHandler來處理這個問題。
我們在平常中下載資源時肯定不止是一個的,所以我們通過msg.what = (1,2,3,4…);來代表每一個程序,然後用MyHandler 來獲取它的值,然後經過if判斷來呼叫這個執行緒就行了,這裡為了簡單的訴說整個過程我採用的是if,你們可以用swith這樣會更好一點。

 SubThread->MainThread    錯誤
  SubThread->Handler->MainThread     正確