程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> handler-下圖的例子中為什麼需要一個Handler object?

handler-下圖的例子中為什麼需要一個Handler object?

編輯:編程綜合問答
下圖的例子中為什麼需要一個Handler object?
public class ProgressBarTest extends Activity {

    private int progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.progress_bar);
        final Handler handler = new Handler();
        progress = 0;
        final ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);
        new Thread(new Runnable() {
            public void run() {
                while (progress < 10) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    progress++;
                }
                handler.post(new Runnable() {

                    @Override
                    public void run() {
                        pb.setVisibility(View.GONE);
                    }
                });
            }
        }).start();
    }
}

為什麼不能把 pb.setVisibility(View.GONE) 放在第一個 Runnable 內部類中?下面的代碼程序崩潰。

 new Thread(new Runnable() {
            public void run() {
                while (progress < 10) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    progress++;
                    pb.setVisibility(View.GONE);
                }
            }
        }

當 setVisibility 語句執行時程序崩潰。

最佳回答:


因為
handler.post(new Runnable() {

                @Override
                public void run() {
                    pb.setVisibility(View.GONE);
                }
            });

是通知主線程(也就是UI線程去刷新界面),而後面你沒有通知主線程,只是在子線程中刷新,android是線程不安全的,所以只有UI線程可以刷新界面,所以子線程刷新造成了crash

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved