0

Я создаю нить для анимированного изображения изменения на графике ui. Это будет прерывание при нажатии кнопки и установка фиксированного изображения. Но если setImage в runOnUiThread случайно произойдет после setImage в onClick, это будет неправильное изображение.Как я могу пройти через где-нибудь после прерывания потока?

Есть ли какой-либо способ в этом коде, возможно, пройти через где-то после возвращения из InterruptedException. (Я не хочу больше задерживаться на нитке ui)

Пожалуйста, помогите спасибо!

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; 
        } 
       } 
      } 
     } 
    }; 

// раз OnClick

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

Edit: я переписать эту часть, как это предлагается.

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" не в протекторе сна! Он пошел в OnCancel, но на самом деле не отменить, я получил ложное isCanceled() Бревна фотографии, как следовать enter image description here

ответ

0

Вы можете быть лучше использовать AsyncTask для этого типа фоновой работы, поскольку она позволяет выполнять отдельные Операции пользовательского интерфейса в зависимости от того, выполняется или прекращается выполнение задачи.

К примеру, в этом образце AsyncTask ниже:

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 
    } 
} 

Если фоновая операция прошла успешно, вы бы обновить пользовательский интерфейс с новым изображением в onPostExecute(), который работает в потоке пользовательского интерфейса. Если вы прервите поток, например, нажав кнопку, вы отмените задачу, а вместо onPostExecute() вместо этого будет вызываться метод onCancelled(). Этот метод также работает в потоке пользовательского интерфейса, и вы можете просто обновить свой интерфейс с изображением по умолчанию.

+0

hmmm .. вид той же проблемы с AsyncTask, и что мне нужно в AsyncTask onProgressUpdate не onPostExecute, это закончит поток while. Проблема возникает из void ImageViewAnimatedChange, которую я создал, это использует anim_in и anim_out в нем, так что это все равно происходит после того, как setImage (без анимации) –

Смежные вопросы