0

onCreateView次のように、メソッドから別のスレッドを開始したい:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new Thread(new Runnable(){
        public void run(){
            checkRoot();
        }
    }).start();
}

しかし、logcat でこのエラーが発生しています:

06-16 12:52:37.088: E/AndroidRuntime(9707): FATAL EXCEPTION: Thread-804
06-16 12:52:37.088: E/AndroidRuntime(9707): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

使用できることはわかっていますAsyncTaskが、好奇心のためだけに上記の方法を使用したいと考えています。

これはcheckRoot方法です:

private void checkRoot(){
    Process p;
    try{
        // Preform su to get root privledges
        p = Runtime.getRuntime().exec("su");

        // Attempt to write a file to a root-only
        DataOutputStream os = new DataOutputStream(p.getOutputStream());
        os.writeBytes("mount -o rw,remount -t yaffs2 /dev/block/mtdblock0 /system\n");
        os.writeBytes("echo \"Do I have root?\" >/system/etc/temporary.txt\n");

        // Close the terminal
        os.writeBytes("exit\n");
        os.flush();

        try{
            p.waitFor();
            if(p.exitValue() != 225){
                showToast("ROOTED !");
            } else {
                showToast("not root");
                setContentView(R.layout.no_root);
            }
        } catch(InterruptedException e){
            showToast("not root");
            setContentView(R.layout.no_root);
        }
    } catch(IOException e){
        showToast("not root");
        setContentView(R.layout.no_root);
    }
}
4

1 に答える 1

3

バックグラウンド スレッドから ui を更新することはできません。ui スレッドから ui を更新する必要があります。

    showToast("not root");
    setContentView(R.layout.no_root);

runonUithread を使用する

      runOnUiThread(new Runnable() //run on ui threa
      {
          public void run() 
          { 

          }
       });  

また、同じアクティビティに対して setContentView を 2 回使用することは、適切な設計ではありません。デザインを再考してください。

ハンドラーを使用することもできます

于 2013-06-16T07:39:16.417 に答える