Подтвердить что ты не робот

Как обновить изображение сразу

В моем приложении для Android я загружаю изображение из облака. Загрузка выполняется в потоке, и в этом же потоке я также установил представление изображения с недавно загруженным изображением. После установки изображения я вызываю postinvalidate().

Однако изображение сразу не появляется. Есть ли способ сделать перерисовку немедленно? Мне нужен способ запуска цикла рисования.

4b9b3361

Ответ 1

Каждый класс, полученный из класса View, имеет метод invalidate() и postInvalidate(). Если вызов invalidate() вызывается, он сообщает системе, что текущий вид изменился, и он должен быть переименован как можно скорее. Поскольку этот метод может быть вызван только из вашего UIThread, нужен другой метод, если вы не в UIThread и все еще хотите уведомить систему что ваш вид был изменен. Метод postInvalidate() уведомляет систему из не-UIThread, и представление как можно скорее перерисовывается в следующем eventloop на UIThread.

В вашем случае вы можете добиться того, чего хотите, с помощью AsyncTask (интеллектуальная задняя нить).AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции (загружать изображение в фоновом режиме в вашем случае) и публиковать результаты (установить растровое изображение в ваш ImageView) в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.

Асинхронная задача определяется вычислением, которое выполняется на фоновом потоке и результат которого публикуется в потоке пользовательского интерфейса. Асинхронная задача определяется 3 типами, называемыми Params, Progress и Result и 4 шага, называемыми begin, doInBackground, processProgress и end.

4 шага

Когда выполняется асинхронная задача, задача выполняет 4 шага:

onPreExecute(), вызывается в потоке пользовательского интерфейса сразу после выполнения задачи. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе перед загрузкой изображения из облака и используемым для обеспечения хорошего пользовательского опыта.

doInBackground(Params...), вызывается в фоновом потоке сразу после выполнения onPreExecute() завершает выполнение. Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. Параметры асинхронной задачи передаются на этот шаг. Результат вычисления должен быть возвращен этим шагом и будет возвращен на последний шаг. Этот шаг также может использовать publishProgress (Progress...) для публикации одного или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на этапе onProgressUpdate (Progress...).

onProgressUpdate(Progress...), вызывается в потоке пользовательского интерфейса после вызова publishProgress(Progress...). Время выполнения undefined. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, когда фоновое вычисление все еще выполняется.

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

Ответ 2

Вы пытались использовать invalidate()? Это заставляет зрение перерисовываться немедленно, а не в течение следующего цикла

Ответ 3

Invalidate не работает. Временное изменение uri или url или пути изображения и переход на требуемый путь. Например, если у меня есть

image_url="myhost/img.png";
himg.setImageUrl(image_url, imageLoader);

Я могу обновить это как:

 himg.setImageUrl(null, imageLoader);
 himg.setImageUrl(image_url, imageLoader)

Ответ 4

new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (!socket.isClosed()) {
                    imgArray = receiveImagebytes();
                }
            }
        }).start();

        try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


while (!socket.isClosed()) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub

                    imageView.setImageBitmap(BitmapFactory.decodeByteArray(imgArray, 0, imgArray.length));
                    imageView.invalidate();
                }
            });