java - 每当我单击“后退”/“主页”按钮时,代码的asynctask部分就会关闭/停止该应用程序

标签 java android multithreading android-asynctask runnable

谁能帮助我解决asynctask中的错误?我想我知道为什么会出现错误,但是我不知道该怎么解决。非常感谢你。

这是我的asynctask代码(只想使用Surfaceview将其用于操纵杆)

public class MySurfaceThread extends AsyncTask<Void, Void, Void> {


    SurfaceHolder mSurfaceHolder;
    CustomSurfaceView cSurfaceView;


    public MySurfaceThread(SurfaceHolder sh, CustomSurfaceView csv) {
        mSurfaceHolder = sh;
        cSurfaceView = csv;
        x = y = 0;

        cSurfaceView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                x = event.getX();
                y = event.getY();

                calculateValues(x, y);

                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:

                        break;
                    case MotionEvent.ACTION_UP:
                        x = y = 0;
                        dx = dy = 0;
                        break;
                    case MotionEvent.ACTION_CANCEL:

                        break;
                    case MotionEvent.ACTION_MOVE:

                        break;
                }

                return true;
            }

            private void calculateValues(float xx, float yy) {
                dx = xx - zeroX;
                dy = yy - zeroY;
                angle = (float)Math.atan(Math.abs(dy/dx));
                hyp = (float)Math.sqrt((dx * dx) + (dy * dy));

                if(hyp > radius) {
                    if(dx > 0 && dy > 0){ //bottom right
                        xx = (zeroX + (radius*(float)Math.cos(angle)));
                        yy = (zeroY + (radius*(float)Math.sin(angle)));
                    }
                    else if(dx > 0 && dy < 0){ //top right
                        xx = (zeroX + (radius*(float)Math.cos(angle)));
                        yy = (zeroY - (radius*(float)Math.sin(angle)));
                    }

                    else if(dx < 0 && dy < 0){ //top left
                        xx = (zeroX - (radius*(float)Math.cos(angle)));
                        yy = (zeroY - (radius*(float)Math.sin(angle)));
                    }

                    else if(dx < 0 && dy > 0) { //bottom left
                        xx = (zeroX - (radius*(float)Math.cos(angle)));
                        yy = (zeroY + (radius*(float)Math.sin(angle)));
                    }
                }

                else {
                    xx = zeroX + dx;
                    yy = zeroY + dy;
                }

                x = xx;
                y = yy;
            }


        });
    }

    @Override
    protected Void doInBackground(Void... params) {
        Canvas canvas = null;

        while (running) {
            try {
                canvas = mSurfaceHolder.lockCanvas();
                synchronized (mSurfaceHolder) {
                    zeroX = canvas.getWidth()/2;
                    zeroY = canvas.getHeight()/2;
                    cSurfaceView.onDraw(canvas, x, y, zeroX, zeroY);
                }
                Thread.sleep(10);
            } catch (InterruptedException e) {

            } finally {
                if (canvas != null) {
                    mSurfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
        return null;
    }
}

我可以使用runnable和thread来执行相同的任务吗?如果是这样,怎么办?谢谢你。

编辑

这是logcat中的错误消息:
03-09 15:23:52.394    4135-4159/com.example.r.bluetoothsample E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.example.r.bluetoothsample, PID: 4135
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)
 Caused by: java.lang.NullPointerException
        at com.example.r.bluetoothsample.CustomSurfaceView$MySurfaceThread.doInBackground(CustomSurfaceView.java:182)
        at com.example.r.bluetoothsample.CustomSurfaceView$MySurfaceThread.doInBackground(CustomSurfaceView.java:95)
        at android.os.AsyncTask$2.call(AsyncTask.java:288)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)

最佳答案

如果您的表面不可用,那么 lockCanvas() 将返回null(我假设它在您离开 Activity 时会变为null)。这意味着您将在NullPointerException调用中遇到getWidth()

附带说明,我希望您在 Activity 的running方法中停止该后台循环(也许通过将false设置为onPause()吗?)-否则,它将继续在后台循环,这是不希望的。

关于java - 每当我单击“后退”/“主页”按钮时,代码的asynctask部分就会关闭/停止该应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35885156/

相关文章:

java - RxJava BehaviorSubject 没有发出最后一项?

java - O(n log(n)) 算法,检查 int[] 中的 2 个数字之和是否 = 给定数字

java - org.hibernate.exception.JDBCConnectionException : Cannot open connection

java - XML自动编辑器(基于XSD方案)

Android:如何缩放、平移(滚动)井字棋板 View

java - 实例控制类和多线程

android - Android Studio 中的 NDK 集成错误

javascript - 如何从 Firebase 数据快照中检索数据

c# - 在多线程C#应用程序中使用互操作的Excel文件操作失败

c# - 多线程C#应用程序占用了很高的CPU使用率