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中的imageview_Android_Multithreading_Sockets_Background_Imageview - Fatal编程技术网

用我在后台获得的图像刷新android中的imageview

用我在后台获得的图像刷新android中的imageview,android,multithreading,sockets,background,imageview,Android,Multithreading,Sockets,Background,Imageview,我的问题是关于这条线索- 我也在尝试通过套接字获取图像,对其进行解码,并将其设置在imageview上。 套接字需要保持打开状态,以防发送另一个图像,然后我会再次更新imageview 当在另一个线程中,他们响应不在主线程中执行时,我没有得到该部分 从主活动中,我应该打开一个新线程,该线程将在“while(true)”上“卡住” 因此,它可以继续收听即将发布的图像,并且在发送完整图像时,它需要更新imageview。 但是imageview在主线程中(主线程等于UI线程?),所以对我来说它开始

我的问题是关于这条线索-

我也在尝试通过套接字获取图像,对其进行解码,并将其设置在imageview上。 套接字需要保持打开状态,以防发送另一个图像,然后我会再次更新imageview

当在另一个线程中,他们响应不在主线程中执行时,我没有得到该部分

从主活动中,我应该打开一个新线程,该线程将在“while(true)”上“卡住” 因此,它可以继续收听即将发布的图像,并且在发送完整图像时,它需要更新imageview。 但是imageview在主线程中(主线程等于UI线程?),所以对我来说它开始有点问题了

有人吗

//添加- 这就是我的任务-

public class AsyncTask extends AsyncTask<Void, Void, Void> {
 private DataInputStream dataInputStream = null;
 private ImageView iv = null;

 public RobotMapAsyncTask(DataInputStream dataStream, ImageView imageView) {
     dataInputStream = dataStream;
     iv = imageView;
 }

@Override
protected Void doInBackground(Void... params) {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    byte[] byteChunk = new byte[1024];
    Bitmap bitmap = null;
    int c;

    if (dataInputStream != null) {
        while (true) {
            try {
                byteChunk = new byte[1024];
                while ((c = dataInputStream.read(byteChunk)) != -1){
                    buffer.write(byteChunk, 0, c);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            bitmap = BitmapFactory.decodeByteArray(byteChunk, 0, byteChunk.length);

            if (bitmap != null) {
                //runOnUiThread(new Runnable() {
                    //public void run() {
                        //iv.setImageBitmap(bitmap);
                    //}
               // }); 
            }
        }
    }

    return null;
}
公共类AsyncTask扩展了AsyncTask{
私有DataInputStream DataInputStream=null;
私有ImageView iv=null;
公共RobotMapAsyncTask(DataInputStream数据流,ImageView ImageView){
dataInputStream=数据流;
iv=图像视图;
}
@凌驾
受保护的Void doInBackground(Void…参数){
ByteArrayOutputStream缓冲区=新建ByteArrayOutputStream();
byte[]byteChunk=新字节[1024];
位图=空;
INTC;
如果(dataInputStream!=null){
while(true){
试一试{
byteChunk=新字节[1024];
while((c=dataInputStream.read(byteChunk))!=-1){
buffer.write(byteChunk,0,c);
}
}捕获(IOE异常){
e、 printStackTrace();
}
位图=BitmapFactory.decodeByteArray(byteChunk,0,byteChunk.length);
if(位图!=null){
//runOnUiThread(新的Runnable(){
//公开募捐{
//iv.设置图像位图(位图);
//}
// }); 
}
}
}
返回null;
}

但是我显然不能调用RunnuiThread,因为这不是一个活动…

在由
活动启动的Runnable中更改ImageView的图像。RunnuiThread(Runnable)
Handler.post(Runnable)
在由
活动启动的Runnable中更改ImageView的图像。RunnuiThread(Runnable)
Handler.post(Runnable)

获得新图像后,请调用以下命令:

runOnUiThread(new Runnable() {
        public void run() {
            imView.setBackgroundResource(yourResource);
        }
    });   

只需进行明显的更改以适应您的代码即可

在您获得新图像后,将其称为:

runOnUiThread(new Runnable() {
        public void run() {
            imView.setBackgroundResource(yourResource);
        }
    });   

只需进行明显的更改以适应您的代码即可

您可以通过两种方式完成此操作:

a) 一种方法是使用主线程中的handler和runnable调用工作线程,主线程执行图像的获取和解码。获得解码后的图像后,只需从工作线程中设置imageview


b) 或者,您可以使用android的异步任务功能获取图像,并在主线程上更新imageview。您可以通过两种方式执行此操作:

a) 一种方法是使用主线程中的handler和runnable调用工作线程,主线程执行图像的获取和解码。获得解码后的图像后,只需从工作线程中设置imageview


b) 或者,您可以使用android的异步任务功能在主线程上获取图像并更新imageview

wait方法我启动获取am图像的后台线程。从该后台线程我应该按照您的要求运行另一个runnable并更新imageView?是的,此runnable将在UI线程上运行,以便更新imageView。等等。在主活动上,在onCreate()中方法我启动获取am图像的后台线程。从该后台线程我应该按照您的要求运行另一个runnable并更新imageView?是的,此runnable将在UI线程上运行,以便更新您的imageView。只需在doinbackground方法中返回一个位图,并在PostExecute中添加一个将位图作为参数的方法在这个方法中,将imageview设置为这个位图,但正如你所说的-我需要以某种方式刷新UI线程,以便我看到更改(@VinceFR建议runOnUIThread或post,但这不是活动或处理程序)。更重要的是-当我返回doInBackground时,异步任务结束。我需要继续侦听套接字中的其他图像。我不想返回并转到onPostExecute…只需在doInBackground方法中返回位图,并在onPostExecute中添加一个方法,该方法将位图作为参数,在该方法中设置imageview到这个位图,但正如你所说的-我需要以某种方式刷新UI线程,以便我看到更改(@VinceFR建议runOnUIThread或post,但这不是一个活动或处理程序).更重要的是-当我返回doInBackground时,异步任务结束。我需要继续侦听套接字中的其他图像..我不想返回并转到onPostExecute。。。