2013-07-30 48 views
0

我的代码有一个奇怪的问题,在过去的几天里无法解决。让我这样说:我有两个线程的数组,从2个独立的流中检索图像,并且在每个数据流的屏幕上更新两个图像浏览。因此,stream1更新imageview1和stream2更新imageview2。但是,当我这样做时,流会不断交换图像。也就是说,stream1图像在imageview2上进行,反之亦然。我调试了代码,根据线索索引将图像保存在两个不同的文件夹中,并且看到保存的图像根本不会混淆。我的代码太长,无法发布,但我会尽力缩小范围并提供重要的位。哦,我还添加了日志,看看它们是否继续交换,但看到代码完美运行并且日志证明了它。Multrithreading UI更新android

UPDATE

调用两个线程

if(stream.size() >= 1) 
{ 
    try 
    { 
     splitScreenLiveThreads[0] = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       LiveImages(0); 
      } 
     }); 
     splitScreenLiveThreads[0].start(); 
    }catch(Exception ex){ 

    } 
} 
if(stream.size() >= 2) 
{ 
    try 
    { 
     splitScreenLiveThreads[1] = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       LiveImages(1); 
      } 
     }); 
     splitScreenLiveThreads[1].start(); 
    } 
    catch(Exception ex) 
    { 
    } 
} 

更新UI

byte [] b = getImageBytes(thIndex); 
final Bitmap bmp = latestFrames[thIndex]; 
    switch (thIndex) 
    {     
    case 0: 
    { 
     imgView1.post(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       imgView1.setImageBitmap(bmp); 
      } 
     }); 
     //latestFrame.recycle(); 
     break; 
    } 

    case 1: 
    { 
     imgView2.post(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       imgView2.setImageBitmap(bmp); 
      } 
     }); 
     //latestFrame.recycle(); 
     break; 
    } 
    } 
+0

thIndex是流索引,而bmp是LiveImages(索引)中的局部变量,所以无论何时我调用getImageBytes [thIndex]它都将检索特定流的字节,因此我创建了一个bmp位图。 –

+1

是否涉及ListView? – Krylez

+0

不,我相信你在看到switch case语句时弹出了这个问题。我在这里使用它来根据threadIndex更新imageview –

回答

0

正确的家伙我设法解决我的问题,这是我的代码中的一个错误...刚刚意识到我的愚蠢高度和时间我试图修复它的损失。基本上我试图通过处理一些位图来做一些内存管理,其中有一个全局位图变量,我用它作为一个中间变量,这是由两个线程共享的,这是造成这个问题的原因。