-1

나는 안드로이드의 초보자입니다. 나는 스레드 (사각형을 그릴) 그릴 수있는 간단한 표면보기를 만드는거야,하지만이 같은 오류가 계속 :Surfaceview로 그려주는 thread 에러 NULLPointerException

java.lang.NullPointerException이 '무효 android.graphics.Canvas을 가상 메소드를 호출을 시도합니다. 널 객체 참조

에 drawColor (INT) '이 내 코드입니다 :

myActivity.java :

public class myActivity extends AppCompatActivity { 

mySurfaceView mysurfaceview; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_ball); 

    //mysurfaceview = new mySurfaceView(this); 
    mysurfaceview = (mySurfaceView) findViewById(R.id.mySurfaceView); 
    mysurfaceview.RunThread(); 
} 

mySurfacevie w.java :

public class mySurfaceView extends SurfaceView implements SurfaceHolder.Callback { 

public DrawThread DrawThread; 
private Rect myrectangle; 
private Paint myPaint; 

int moveX = 0; 

private void init() { 
    myrectangle = new Rect(150, 150, 700, 500); 
    myPaint = new Paint(); 
    myPaint.setColor(Color.BLUE); 
} 

public mySurfaceView(Context context) { 
    super(context); 
    //init(); 
} 

public mySurfaceView(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); } 

public mySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); } 

public void onDrawSomething(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 
    canvas.drawRect(myrectangle, myPaint); 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { } 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { } 

public void update(){ 
} 

public void RunThread() { 
    init(); 
    DrawThread = new DrawThread(getHolder(), this); 
    DrawThread.setRunning(true); 
    DrawThread.start(); 
} 

public class DrawThread extends Thread { 
    //var definition 
    public boolean run = false; 
    private SurfaceHolder surfaceHolder; 
    mySurfaceView mysurfaceView; 

    public DrawThread(SurfaceHolder surfaceHolder, mySurfaceView mysurfaceView) { 
     this.surfaceHolder = surfaceHolder; 
     this.mysurfaceView = mysurfaceView; 
    } 

    public void setRunning(boolean run) { 
     this.run = run; 
    } 

    @Override 
    public void run() { 
     while(run) 
     { 
      //implement fps counter 
      Canvas canvas = null; 
      try { 
       canvas = surfaceHolder.lockCanvas(); 
       synchronized (surfaceHolder) { 
        mysurfaceView.onDrawSomething(canvas); 
        //mysurfaceView.update(); 
       } 
      } finally { 
       if(canvas != null) 
       { 
        surfaceHolder.unlockCanvasAndPost(canvas); 
       } 
      } 
     } 
    } 
} 

}

그리고 이것은 표면보기 보여 내 XML 코드 :

<com.example.firstapp_aurelia.mySurfaceView 
     android:id="@+id/mySurfaceView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

내가 여기 뭐 잘못 했나요를? 정말 고맙습니다.

+1

당신의 질문은 훨씬 더 좋을 것이다 당신에게 코드를 실행하지하지만 초기 mySurfaceView을하지 않았다. 추적 가능성이 문제와 거의 일치 할 가능성이 매우 높습니다. 즉, 귀하의 질문이있는 것처럼 보이는 것은 대답을 얻으 려 할만큼 충분하다는 것입니다. –

답변

0

나는 당신이 역 추적을 포함하면 두 번

mysurfaceview = new mySurfaceView(this); 
mysurfaceview = (mySurfaceView) findViewById(R.id.mySurfaceView); 
+0

아, 미안하지만, 'mysurfaceview = new mySurfaceView (this);'라고 코멘트하는 것을 잊어 버린다. 그러나 비록 내가 주석을 달았지만, 앱은 계속 같은 오류가 발생합니다. – lacyeex

+0

다른 스레드에서 아무 것도 그리지 않고 UI 스레드에서 캔버스 개체를 조작하고 백그라운드 스레드에서 논리를 업데이트하려고하지 마십시오. – killerz117