2017-06-19 21 views
0

使用SurfaceView和繪製數組中的元素(在另一個線程中更新)時面臨問題。數組中的值總是不爲空。下面我給出了代碼和錯誤消息。憑什麼可以連接?我會很樂意提供幫助!使用另一個線程中的數組處理循環時的異常

SurfaceViewThread:

@Override 
     public void run() { 
      Canvas canvas; 
      while (runFlag) { 
       canvas = null; 
       try { 
        // получаем объект Canvas и выполняем отрисовку 
        canvas = surfaceHolder.lockCanvas(null); 
        synchronized (bw.multithreadLayers) { 
         if (canvas == null) return; 
         p.setShader(new LinearGradient(0, 0, 0, scrH, bw.getColor(), bw.getColor2(), Shader.TileMode.MIRROR)); 
         canvas.drawPaint(p); 
         p.setShader(null); 
         p.setTextSize(textSize); 
         p.setColor(0xFFffffff); 

         for (int i = 0; i<bw.multithreadLayers.size(); i++) { 
          try { 
           for (int j = 0; j<bw.multithreadLayers.get(i).size(); j++) { 
            GObject go = bw.multithreadLayers.get(i).get(j); 
            canvas.drawBitmap(go.getTexture(), go.getX(), scrH-go.getY()-go.getTexture().getHeight(), p); 
           } 
          } catch(Exception e) { 
           System.out.println("JException, " + i + ", " + e.getMessage()); 
          } 
         } 

         canvas.drawBitmap(player, objX, objY, p); 
//some code... 
        } 
       } 
       finally { 
        if (canvas != null) { 
         surfaceHolder.unlockCanvasAndPost(canvas); 
        } 
       } 
      } 
     } 

MultithreadLayers:

lowLayers.clear(); 
     lowLayers.add(layer0); 
     lowLayers.add(layer1); 
     lowLayers.add(layer2Active); 
     multithreadLayers = lowLayers; 

例外:

06-19 08:05:41.967 I/System.out(30470): JException, 0, Attempt to invoke virtual method 'java.lang.Object java.util.ArrayList.get(int)' on a null object reference 

而且

06-19 08:05:43.601 I/System.out(30470): JException, 1, Index: 1, Size: 3 
+0

由於這些例外的,閃爍出現在屏幕上... –

+0

檢查'bw.multithreadLayers.get(我)'爲空,如果沒有則繼續用'bw.multithreadLayers.get(i).get(j)'...同樣檢查null爲'GObject go' –

+1

查看堆棧跟蹤以查找導致錯誤的代碼行。 –

回答

0

我發現了這個問題。我忘了在ArrayList中調用clone():d

multithreadLayers = (ArrayList<ArrayList<GObject>>) lowLayers.clone();