2017-01-18 2 views
0

私はアンドロイドのUIを扱っています。私はここで非常によく見られる問題に直面しています。 AsyncTaskを使用することによりは、私が欲しいへ:Android UIにいくつかの更新が省略されました

の1-ショーがProgressDialogがその間にいくつかのものは、ユーザーが実際の行動

、3-ための準備をさせるためにカウントダウンを表示する準備ができて

2-取得その後、音を再生するサンプルを通知するカウントダウンが別のProgressDialogが

5を取って10秒のサンプルを表す

、4-ショーはその後、音を再生させていただきますサンプルは

まあを取られ、これが私の結果である:

1- MISSING細かい

2-ワークス、UIが更新されないが、バックグラウンド・プロセスが

、3-事業を実行しています細かい

、4-細かい

5-罰金

ワークス

最初の進捗ダイアログを処理するコードを削除すると、他の部分が期待通りに実行/表示されます。私はある時点でUIをブロックするものがあることを理解していますが、私はそれをブロックしていることを理解するためにアンドロイドの初心者です。

ご協力いただきありがとうございます。カウントダウン値

    • あなたが通知されていません
    • onProgressUpdate()

    doInBackground()onProgressUpdate()方法は、2つの異なるで実行されている競合状態があります:

    public class SnapshotActivity extends AppCompatActivity { 
    
        private int COUNTDOWN_TIME = 5; 
        private Button startStop; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_snapshot); 
         startStop = (Button) findViewById(R.id.btnStartStop); 
         startStop.setText("START"); 
        } 
    
        public void startSnapshot(View view) { 
         startStop.setClickable(false); 
         new Async(SnapshotActivity.this).execute(); 
        } 
    
        class Async extends AsyncTask<Void, Void, Void>{ 
    
          TextView tv = (TextView) findViewById(R.id.tvCountDown); 
          ProgressDialog progressDialog ; 
          ProgressDialog preparing; 
          Context context; 
    
          int flag = 0; 
          int counter = COUNTDOWN_TIME; 
    
          public Async(Context context) { 
           this.context = context; 
           progressDialog = new ProgressDialog(context); 
           preparing = new ProgressDialog(context); 
          } 
    
          @Override 
          protected void onPreExecute(){ 
           super.onPreExecute(); 
          } 
    
          @Override 
          protected Void doInBackground(Void... params) { 
    
           //PROGRESS DIALOG 
           flag = 4; 
           publishProgress(); 
           try { 
    
            //SIMULATE SOME WORKLOAD 
            Thread.sleep(2000); 
           } catch (InterruptedException ex) { 
            Thread.currentThread().interrupt(); 
           } 
           flag = 5; 
           publishProgress(); 
    
           //HANDLE THE COUNTDOWN 
           for(counter = COUNTDOWN_TIME; counter>=1; counter--){ 
            publishProgress(); 
            try { 
             Thread.sleep(1000); 
            } catch (InterruptedException ex) { 
             Thread.currentThread().interrupt(); 
            } 
           } 
    
           //PLAY THE SOUND 
           new Thread(new Runnable() { 
            @Override 
            public void run() { 
             Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
             Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
             r.play(); 
            } 
           }).start(); 
    
           //PROGRESS DIALOG 
           flag = 1; 
           publishProgress(); 
    
           //10s SAMPLE 
           flag = 2; 
           for(int j = 0; j <= 10; j++){ 
    
            try { 
             Thread.sleep(1000); 
            } catch (InterruptedException ex) { 
             Thread.currentThread().interrupt(); 
            } 
            publishProgress(); 
           } 
    
           //PLAY THE SOUND 
           new Thread(new Runnable() { 
            @Override 
            public void run() { 
             Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
             Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
             r.play(); 
            } 
           }).start(); 
    
           flag = 3; 
           publishProgress(); 
    
           return null; 
          } 
    
          @Override 
          protected void onProgressUpdate(Void... values) { 
           super.onProgressUpdate(values); 
    
           switch (flag) { 
            case 0: 
             tv.setText(String.valueOf(counter)); 
             break; 
    
            case 1: 
             tv.setText(""); 
             progressDialog.setTitle("TAIKING SAMPLE"); 
             progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
             progressDialog.setMax(10); 
             progressDialog.setCanceledOnTouchOutside(false); 
             progressDialog.show(); 
             break; 
            case 2: 
             progressDialog.incrementProgressBy(1); 
             break; 
            case 3: 
             progressDialog.dismiss(); 
             break; 
            case 4: 
             preparing.setMessage("Starting the device..."); 
             preparing.setCanceledOnTouchOutside(false); 
             preparing.show(); 
             break; 
            case 5: 
             preparing.dismiss(); 
             break; 
            default: 
             break; 
           } 
          } 
    
          @Override 
          protected void onPostExecute(Void result) { 
           super.onPostExecute(result); 
           startStop.setClickable(true); 
          } 
         } 
    } 
    
  • +0

    メインインスタンスでタスクインスタンスを作成し、 'execute()'を呼び出していますか? – nandsito

    +0

    @nandsitoはい、私はこうする: '新しいAsync(SnapshotActivity.this).execute();' –

    答えて

    0

    は二つの問題がありますスレッドと両方のメソッド/スレッドは、安全でない方法でflagフィールドにアクセスしています。 flagの値をdoInBackground()に設定する代わりに、onProgressUpdate()で読み取る場合は、publishProgress()コールで直接この値を通知できます。したがって、以下を実行することをお勧めします:

    public class SnapshotActivity extends AppCompatActivity { 
    
        // ... 
    
        // Change the Progress generic type to Integer. 
        class Async extends AsyncTask<Void, Integer, Void> { 
    
         // Remove the flag field. 
         // int flag = 0; 
    
         @Override 
         protected Void doInBackground(Void... params) { 
    
          //PROGRESS DIALOG 
          // Pass the flag argument in publishProgress() instead. 
          // flag = 4; 
          publishProgress(4); 
    
          // ... 
    
          // flag = 5; 
          publishProgress(5); 
    
          //HANDLE THE COUNTDOWN 
          for (counter = COUNTDOWN_TIME; counter>=1; counter--){ 
    
           // The countdown progress has two parameters: 
           // a flag indicating countdown and 
           // the countdown value. 
           publishProgress(6, counter); 
    
           // ... 
          } 
    
          //PLAY THE SOUND 
    
          // ... 
    
          //PROGRESS DIALOG 
          // flag = 1; 
          publishProgress(1); 
    
          //10s SAMPLE 
          // flag = 2; 
          for(int j = 0; j <= 10; j++){ 
    
           // ... 
    
           publishProgress(2); 
          } 
    
          //PLAY THE SOUND 
    
          // ... 
    
          // flag = 3; 
          publishProgress(3); 
    
          return null; 
         } 
    
         // This signature changes. 
         @Override 
         protected void onProgressUpdate(Integer... values) { 
          super.onProgressUpdate(values); 
    
          // Redeclare flag here. 
          int flag = values[0]; 
    
          switch (flag) { 
    
           // ... 
    
           case 6: 
            tv.setText(Integer.toString(values[1])); 
            break; 
    
           // ... 
          } 
         } 
        } 
    } 
    
    関連する問題