2017-06-19 2 views
0

Face à un problème lors de l'utilisation de SurfaceView et des éléments de dessin d'un tableau mis à jour dans un autre thread. Les valeurs dans le tableau ne sont toujours pas nulles. Ci-dessous, je donne le code et les messages d'erreur. Avec quoi peut-il être connecté? Je serai très heureux d'aider!Exception dans la boucle lors de l'utilisation d'un tableau à partir d'un autre thread

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; 

Exceptions:

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 

Et

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

En raison de ces exceptions, vacillante apparaît à l'écran ... –

+0

Vérifiez si 'bw.multithreadLayers.get (i)' est nulle, sinon passez alors avec 'bw.multithreadLayers.get (i) .get (j)' ... Vérifiez également null pour 'GObject go' –

+1

Regardez la trace de la pile pour trouver la ligne de votre code qui provoque l'erreur. –

Répondre

0

J'ai trouvé le problème. J'ai oublié d'appeler clone() sur ArrayList: D

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