Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何立即刷新图像视图_Android_Multithreading_Image - Fatal编程技术网

Android 如何立即刷新图像视图

Android 如何立即刷新图像视图,android,multithreading,image,Android,Multithreading,Image,在我的android应用程序中,我从云端下载了一张图片。下载是在一个线程中执行的,在同一个线程中,我还使用新下载的图像设置了一个图像视图。设置完图像后,我调用postinvalidate() 但是,图像不会立即显示。有没有办法让重画立即发生?我需要一种触发绘图循环的方法。您是否尝试使用?它强制立即重绘视图,而不是在下一个周期中重绘视图从视图类派生的每个类都有invalidate()和postInvalidate()方法。如果调用了invalidate()。由于此方法只能从UIThread调用,因

在我的android应用程序中,我从云端下载了一张图片。下载是在一个线程中执行的,在同一个线程中,我还使用新下载的图像设置了一个图像视图。设置完图像后,我调用
postinvalidate()


但是,图像不会立即显示。有没有办法让重画立即发生?我需要一种触发绘图循环的方法。

您是否尝试使用?它强制立即重绘视图,而不是在下一个周期中重绘视图

从视图类派生的每个类都有
invalidate()
postInvalidate()
方法。如果调用了
invalidate()。由于此方法只能从UIThread调用,因此当您在UIThread且仍希望通知系统您的视图已更改时,需要另一个方法。
postInvalidate()

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();
                }
            });
在您的情况下,您可以通过
AsyncTask
(一个智能回退线程)的帮助实现所需的功能。AsyncTask可以正确、轻松地使用UI线程。此类允许在UI线程上执行后台操作(在您的情况下在后台下载图像)和发布结果(将位图设置为ImageView),而无需操作线程和/或处理程序

异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布。异步任务由3种通用类型定义,称为参数、进度和结果,以及4个步骤定义,分别称为开始、完成背景、进程进度和结束

四个步骤

执行异步任务时,任务将经历4个步骤:

onPreExecute()
,在执行任务后立即在UI线程上调用。此步骤通常用于设置任务,例如,在从云下载图像之前,在用户界面中显示进度条,用于提供良好的用户体验

doInBackground(Params…
,在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的背景计算。异步任务的参数被传递到此步骤。此步骤必须返回计算结果,并将返回到最后一步。此步骤还可以使用publishProgress(进度…)发布一个或多个进度单元。这些值在UI线程的onProgressUpdate(Progress…)步骤中发布

onProgressUpdate(Progress…
,在调用
publishProgress(Progress…
后在UI线程上调用。执行的时间未定义。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度


onPostExecute(Result)
,后台计算完成后在UI线程上调用。后台计算的结果作为参数传递到此步骤。在该方法中,您可以将位图设置为imageView,并使视图无效。

无效无效无效无效不起作用。临时更改uri或url或图像路径并更改回所需路径会起作用。例如,如果我有

image_url="myhost/img.png";
himg.setImageURI(image_url, imageLoader);
我可以将其刷新为:

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

我现在还没有试过,但在
onPostExecute()
中似乎可以这样做。看推荐人哦,我现在明白你的问题了。我一直在期待您使用
AsyncTask
。对不起,这不是我的错。