2016-09-15 6 views
1

アンドロイドアプリケーションでスレッドを実行する際に問題が発生しました。ユーザーに何かを尋ねるダイアログが表示され、ユーザーが「はい」をクリックすると、バックグラウンドで何かをしている間に読み込みダイアログが表示されます。スレッドを作成しましたが、[はい]ボタンをクリックすると、プロセスが完了するまでUIはロックされます。Androidスレッドの問題

コード: ダイアログ:

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

      builder.setMessage("LOGO.bin Was Not Found, Would You Like To Extract It?") 
        .setTitle("LOGO Not Found!"); 

      builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 

       getAndExtract(); 


       } 
      }); 
      builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        finish(); 
        System.exit(0); 
       } 
      }); 


      AlertDialog dialog = builder.create(); 
      dialog.show(); 

getAndExtract:

public void getAndExtract() 
{ 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        showLoad("Grabbing Logo..."); 

        getLogo(); 
        Thread.sleep(2000); 
        progressDialog.cancel(); 

        showLoad("Extracting Images..."); 
        extractImages(); 
        Thread.sleep(2000); 
        progressDialog.cancel(); 
       }catch (InterruptedException iE) 
       { 
        iE.printStackTrace(); 
       } 
      } 
     }).run(); 




} 

showLoad:extractImagesの

progressDialog.setMessage(msg); 
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
progressDialog.show(); 

基礎:

Command cmd = new Command(0, "LogoInjector -i " + getFilesDir() + "/LOGO.bin -d -g " + getFilesDir() + "/"); 

RootTools.getShell(true).add(cmd); 
getLogoのの

基礎:

Command cmd = new Command(0, "dd if=/dev/block/mmcblk0p" + partitionIndex + " of=" + getFilesDir() + "/LOGO.bin"); 

RootTools.getShell(true).add(cmd); 

私もrunOnUiThreadでshowLoadを入れてみましたが、変化はなかった...私はprogressDialog.cancelを削除する場合は();読み込みダイアログが表示されますが、抽出が完了した後に表示されます。私は「はい」を押して、getLogo()とextractImages()の両方が完了するまでハングします。

これはなぜ動作しないのかを知る人はいますか?

ありがとうございます!

+0

あなたはAsyncTaskを(使用してみましたか)? – ErickBergmann

答えて

2

はAsyncTaskを使用してみてください:=を助け

final AsyncTask<Void,Void,Void> asyncTask = new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 

      // do whatever you need to do in background 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 

      // do after finished 
     } 
    }; 
    asyncTask.execute(); 

希望]