2016-08-29 3 views
0

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

У меня есть камера, которая принимает изображение на Android, а затем возвращает это изображение в виде растрового изображения, которое будет помещено в ImageView. Возвращаемое изображение приходит из класса, который проделал некоторую работу с UVC-камерой и затем возвращает изображение. Поэтому, когда Activity получает изображение, он получает его через обратный вызов, который был зарегистрирован в интерфейсе. В любом случае, вот код обратного вызова.

@Override 
    public void onCaptureComplete(final Bitmap data) 
    { 
     runOnUiThread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       nextButton.setVisibility(View.VISIBLE); 
       recaptureButton.setVisibility(View.VISIBLE); 
       imageView.setVisibility(View.VISIBLE); 
       imageView.setImageBitmap(data); 
       imageView.invalidate(); 

       ((View) mUVCCameraView).setVisibility(View.INVISIBLE); 

       faceController.closeCamera(); 

       ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
       data.compress(Bitmap.CompressFormat.PNG, 100, stream); 
       byte[] byteArray = stream.toByteArray(); 
       imageData = byteArray; 
      } 
     }); 
    } 

Так первый раз, когда я получаю изображение он устанавливает его, как он был взят в плен, но, если я вернуть изображение в том же экземпляре этой деятельности, поэтому поимка, то изображение просто показывает первое изображение, которое был захвачен и никогда не был вторым изображением. Если я скрою приложение и снова открою его, он сработает и скажет мне, что он пытается ссылаться на растровое изображение, которое больше не существует. Фактические данные - это данные нового изображения, но именно ImageView отказывается обновлять.

Я также попытался использовать AsyncTask для этого и получить тот же результат.

@Override 
public void onCaptureComplete(Bitmap data) 
{ 
    new UpdateUI().execute(data); 
} 

public class UpdateUI extends AsyncTask<Bitmap, Void, Bitmap> 
{ 
    @Override 
    protected void onPreExecute() 
    { 

    } 

    @Override 
    protected Bitmap doInBackground(Bitmap... params) 
    { 
     return params[0]; 
    } 

    @Override 
    protected void onPostExecute(Bitmap data) 
    { 
     nextButton.setVisibility(View.VISIBLE); 
     recaptureButton.setVisibility(View.VISIBLE); 
     imageView.setVisibility(View.VISIBLE); 
     imageView.setImageBitmap(data); 
     imageView.invalidate(); 

     ((View) mUVCCameraView).setVisibility(View.INVISIBLE); 

     faceController.closeCamera(); 

     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     data.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     byte[] byteArray = stream.toByteArray(); 
     imageData = byteArray; 
    } 
} 

Так что я думал, что я могу попытаться изменить активность использовать фрагмент и посмотреть, если это работает или, возможно, с использованием приемника Broadcast, но я не знаю, почему это происходит.

Я думал, что это может быть связано с тем, что данные поступают из экземпляра Static из раздела класса/интерфейса кода, но я пробовал так много вещей, и он просто не обновляется.

Дайте мне знать, если вам нужен код.

Спасибо, Wihan

EDIT: imageView.setVisibility происходит, но не меняющийся растрового изображения.

+0

Теперь я переработал операцию, чтобы использовать фрагмент для части ImageView. Затем на каждом захваченном изображении я заменяю старый фрагмент, но ImageView не обновляется, я думаю, что что-то не так с классом ImageView на моем SDK или чем-то, это не имеет смысла. Я просматриваю растровое изображение в режиме отладки, и я вижу, что изображение отличается, но ImageView показывает то же изображение, которое было записано первым. –

ответ

0

Вы действительно должны смотреть на Пикассо,

Picasso.with(getContext()) 
    .load(URL/URI) (1)  /* Watch below for more details */ 
    .placeholder(R.drawable.ic_nothumb) 
    .resize(120, 120) 
    .into(iv); 

(1) Это Link объяснить, как загрузить изображение из локального хранилища

+0

Не совсем то, что я хочу делать, это для получения изображения по сети, я захватываю изображение с помощью камеры и хочу обновить ImageView ... –

0

Я понятия не имею, почему это происходит, но мне удалось обходите это, преобразовывая изображение, записанное и сохраненное во внутреннем хранилище, к чертежам. Затем я использовал imageView.setImageDrawable вместо setImageBitmap.

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