2013-07-30 92 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

正確的傢伙我設法解決我的問題,這是我的代碼中的一個錯誤...剛剛意識到我的愚蠢高度和時間我試圖修復它的損失。基本上我試圖通過處理一些位圖來做一些內存管理,其中有一個全局位圖變量,我用它作爲一箇中間變量,這是由兩個線程共享的,這是造成這個問題的原因。