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