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