나는 안드로이드의 초보자입니다. 나는 스레드 (사각형을 그릴) 그릴 수있는 간단한 표면보기를 만드는거야,하지만이 같은 오류가 계속 :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" />
내가 여기 뭐 잘못 했나요를? 정말 고맙습니다.
당신의 질문은 훨씬 더 좋을 것이다 당신에게 코드를 실행하지하지만 초기 mySurfaceView을하지 않았다. 추적 가능성이 문제와 거의 일치 할 가능성이 매우 높습니다. 즉, 귀하의 질문이있는 것처럼 보이는 것은 대답을 얻으 려 할만큼 충분하다는 것입니다. –