Java Surfaceview绘制线程错误NULLPointerException

Java Surfaceview绘制线程错误NULLPointerException,java,android,multithreading,nullpointerexception,surfaceview,Java,Android,Multithreading,Nullpointerexception,Surfaceview,我是android的初学者。我正在创建一个简单的曲面视图来绘制线程(绘制矩形),但它不断出现如下错误: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.graphics.Canvas.drawColor(int)” 这是我的代码: myActivity.java: public class myActivity extends AppCompatActivity { mySurfaceView mysurfaceview;

我是android的初学者。我正在创建一个简单的曲面视图来绘制线程(绘制矩形),但它不断出现如下错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void 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();
 }
mySurfaceview.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

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

啊,对不起,我的不好,我忘了评论
mysurfaceview=newmysurfaceview(这个),应该是注释。但是,即使我对此进行了评论,应用程序还是会不断出现相同的错误。不要尝试在其他线程中绘制任何内容,在UI线程中操作画布对象,并在后台线程中更新逻辑。如果包含回溯,您的问题会更好。回溯很可能几乎完全指向问题所在。也就是说,看起来你的问题已经足够好了,可以得到答案了。