0

私は予定されているアニメーション化された変更イメージ用のスレッドを作成します。ボタンをクリックしている間中断し、固定画像を設定します。 しかし、runOnUiThreadのsetImageが誤ってonClickのsetImageの後に起こると、間違ったイメージになります。スレッドが中断された後どこかを確実に確認できますか?

このコードでは、InterruptedExceptionからの復帰後にどこかを確認できる方法はありますか? (私はあなたのスレッドにもう遅れたくない)

ありがとうございました! 示唆したように、私はこの部分を書き換える:onClickの

     if(thread!=null) { 
          thread.interrupt(); // catch interruptException 
          thread = null; 
          imgFunction.setImageResource(R.drawable.selector); 
         } 

編集一度

thread = new Thread(){ 
     @Override 
     public void run() { 
      while(!this.isInterrupted()){ 
       for(int i=0; i<imageList.size(); i++){ 
        if(getActivity()==null) return; 
        getActivity().runOnUiThread(new Runnable() { 
         public void run() { 
          ImageViewAnimatedChange(getActivity().getApplication(), 
             imgFunction, imageList.get(j), 0); 
         } 
        }); 
        try { 
         Thread.sleep(2000); 
        } catch (InterruptedException e) { 
         Log.e(TAG, e.toString()); 
         return; 
        } 
       } 
      } 
     } 
    }; 

//。

public class asyncTask extends AsyncTask<String, String, String>{ 
    @Override 
    protected String doInBackground(String... params) { 
     Log.d(TAG, "doInBackground"); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      Log.w(TAG, e.toString()); 
      return null; 
     } 

     final List<Bitmap> imageList = getImageList(); 
     if(imageList.isEmpty()) return null; 
     Log.d(TAG, "start while "); 

     while(!isCancelled()){ 
      Log.d(TAG, "while:" +Boolean.toString(isCancelled())); 

      for(int i=0; i<imageList.size()+1; i++){ 
       final int j=i; 
       Log.d(TAG, "for" + Integer.toString(j)); 

       if (j == imageList.size()) 
        publishProgress(“ok”); 
       else 
        publishProgress(Integer.toString(i)); 

       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        Log.w(TAG, e.toString()); 
        return null; 
       } 
      } 
     } 
     Log.d(TAG, "while end"); 
     return null; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     QUtil.logE(TAG, "onPostExecute"); 
     imgFunction.setImageResource(R.drawable.selector); 
    } 

    @Override 
    protected void onProgressUpdate(String... value) { 
     super.onProgressUpdate(value); 
     Log.d(TAG, "onProgressUpdate" + value[0]); 
     if(getActivity()==null || isCancelled()) return; 
     if(value[0]==“ok”) 
      ImageViewAnimatedChange(getActivity().getApplication(), 
        imgFunction, null, R.drawable.selector); 
     else 
      ImageViewAnimatedChange(getActivity().getApplication(), 
        imgFunction, getImageList().get(Integer.parseInt(value[0])), 0); 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
     Log.e(TAG, "onCancelled"); 
     try { 
      Thread.sleep(60); 
     } catch (InterruptedException e) { 
      Log.w(TAG, e.toString()); 
     } 
     imgFunction.setImageResource(R.drawable.selector); 
    } 
} 

//

iftttAsyncTask = new IftttAsyncTask().execute(""); 

//最後のonClick

if(asyncTask!=null) { 
          asyncTask.cancel(true); // catch interruptException 
          threadIfttt = null; 
         } 

を開始し、その後時には仕事 "doInBackgroundは" スリープトレッドにない間 が動作しない、動作しません! enter image description here

答えて

0

に従うように、それはそれはあなたが別の実行することができますので、あなたは、バックグラウンドの仕事のこのタイプのAsyncTaskを使用したほうが良いかもしれonCancelに行くが、本当にキャンセルしないで、私はisCanceled(と偽だ) ログの写真でしたUI操作は、タスクが進行中か中断中かによって異なります。バックグラウンド操作が成功した場合、あなたはUIスレッド上で実行されますonPostExecute()の新しいイメージ、とあなたのUIを更新してしまう

public class TestTask extends AsyncTask<String, Void, String> { 

    protected String doInBackground(String... args) { 

     String input = args[0]; 
     String output = "simulated return value"; 

     return output; 
    } 

    protected void onPostExecute(String result) { 
     //if your background operation succeeds, you 
     //would update your image here 
    } 

    protected void onCancelled() { 
     //if your task is cancelled, update your UI with the 
     //default image here 
    } 
} 

:以下AsyncTaskこのサンプルでは例えば

、。ボタンをクリックするなどしてスレッドを中断すると、タスクがキャンセルされ、onPostExecute()ではなく、onCancelled()メソッドが代わりに呼び出されます。このメソッドはUIスレッドでも実行されます。UIのデフォルトのイメージでUIを更新できます。

+0

hmmm .. AsyncTask、 で同じ問題が発生していますが、OnPostExecuteではなくAsyncTask onProgressUpdateで必要なものは、whileスレッドを終了します。 問題はImageViewAnimatedChangeから発生します。これはanim_inとanim_outを使用しているため、setImage(これはアニメーションなし) –

関連する問題