Android活动在切换应用程序时崩溃

埃里亚斯

将Android活动推到后台(按应用程序切换器或主页按钮)时,应用程序立即崩溃(“不幸的是,应用程序已停止。”)。

我的活动如下所示:

public class MyActivity extends Activity {
    MyView myView;

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

有问题的视图使用线程进行绘制:

public class MyView extends SurfaceView implements SurfaceHolder.Callback
{
    protected Engine engine;

    protected SurfaceHolder surfaceHolder;
    protected Context context;

    private PaintThread thread;

    void initView() {
        // Initialize our screen holder
        SurfaceHolder holder = getHolder();
        holder.addCallback( this);

        // Get screen size
        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

        // Initialize engine
        engine = new Engine(displayMetrics.widthPixels, displayMetrics.heightPixels);
        engine.init(context);

        thread = new PaintThread(holder, context, new Handler(), engine);
        setFocusable(true);
    }

    public MyView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
        this.context = context;
        initView();
    }

    public MyView(Context context, AttributeSet attrs){
        super(context, attrs);
        this.context = context;
        initView();
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        Log.i("app", "here!");
        boolean retry = true;

        thread.state = PaintThread.PAUSED;
        while (retry) {
            try {
                thread.join();
                retry = false;
            } catch (InterruptedException e) {}
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        if (thread.state == PaintThread.PAUSED){
            thread = new PaintThread(getHolder(), context, new Handler(), engine);
            thread.start();
        } else {
            thread.start();
        }
    }
}

线程的工作方式如下:

public class PaintThread extends Thread {
    private SurfaceHolder surfaceHolder;
    private Handler handler;
    private Context context;

    private Engine engine;

    public int state = 1;

    public final static int RUNNING = 1;
    public final static int PAUSED = 2;

    public PaintThread(SurfaceHolder surfaceHolder, Context context, Handler handler,
                       Engine engine) {
        this.surfaceHolder = surfaceHolder;
        this.handler = handler;
        this.context = context;

        this.engine = engine;
    }

    @Override
    public void run() {
        long previousUpdate = System.nanoTime();
        long beforeTime;
        long passedTime;
        long accumulator = 0;
        long dt = 1000/60;

        while (state == RUNNING) {
            beforeTime = System.nanoTime();
            passedTime = TimeUnit.MILLISECONDS.convert(beforeTime - previousUpdate, TimeUnit.NANOSECONDS);
            previousUpdate = beforeTime;

            accumulator += passedTime;

            while (accumulator >= dt) {
                engine.update(dt);
                accumulator -= dt;
            }

            Canvas c = null;
            try {
                c = surfaceHolder.lockCanvas(null);

                synchronized (surfaceHolder) {
                    c.drawColor(Color.WHITE);
                    engine.draw(c);
                }
            } finally {
                if (c != null) {
                    surfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }
}

surfaceDestroyed当按下其中一个按钮时,在其方法的视图中将显示日志消息,但应用程序仍然崩溃,并显示以下消息:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ void android.graphics.Canvas.drawColor(int)”

受影响的行来自PaintThreadrun方法:

c.drawColor(Color.WHITE);

似乎lockCanvas在那时还没有返回我们可以使用的Canvas。这似乎是预期的行为,因为在按下这些按钮之一时将画布置于背景中。

但是,这一切都发生只是线程暂停之前。发生这种情况的设置是否有问题,或者如何防止这种情况发生?

约书亚·拜尔(Joshua Byer)

一个if语句,在使用c之前检查c是否为null?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

应用程序崩溃:Android Studio:使用If语句(INTENT)切换活动

来自分类Dev

当我切换活动或关闭应用程序时,Android中的共享首选项不会保存

来自分类Dev

切换活动时应用崩溃

来自分类Dev

从应用程序主屏幕切换到其他活动时,应用程序崩溃

来自分类Dev

切换屏幕时关闭android应用程序?

来自分类Dev

使用超级+标签切换应用程序时使用箭头键

来自分类Dev

切换node.js应用程序时localhost:3000不变

来自分类Dev

切换应用程序时的Gnome 3.20图形故障

来自分类Dev

在使用url方案切换应用程序时定期侦听事件的最佳实践

来自分类Dev

Android:在两个活动之间切换错误-不幸的是,“应用程序名称”已停止

来自分类Dev

为什么快速切换片段时我的应用程序崩溃?

来自分类Dev

不能通过按切换键设置主题。应用程序不会崩溃

来自分类Dev

切换至标签页时,应用程序崩溃

来自分类Dev

数字登录应用程序不会切换活动吗?

来自分类Dev

在活动之间切换时,Android App崩溃

来自分类Dev

从cocos2d-x活动切换到Android上的另一个活动时,应用程序崩溃

来自分类Dev

当我在活动之间切换时,我的应用程序闪烁并在后台显示以前的活动

来自分类Dev

jQuery仅在刷新页面以切换Rails应用程序时有效

来自分类Dev

在gnome-shell 3.2中从应用程序切换器中/在应用程序切换器中终止活动的应用程序进程

来自分类Dev

通过单击选项卡(不滑动)在“滑动”选项卡之间切换时,应用程序崩溃

来自分类Dev

在Android中以编程方式在应用程序图标之间切换

来自分类Dev

如何在Android Studio中的应用程序栏上切换菜单图标

来自分类Dev

切换应用程序后刷卡时,Android RecyclerView项目为空

来自分类Dev

Android Studio-为什么“切换按钮”会关闭应用程序?

来自分类Dev

设计两列Android应用程序-切换视图?

来自分类Dev

在固定方向的中间应用程序之间切换-Android,AndEngine

来自分类Dev

无法使用Appium for Android应用程序在WebView中切换

来自分类Dev

尝试在Android 5.0上切换启动器时,我的应用程序关闭

来自分类Dev

在应用程序内切换iCloud帐户

Related 相关文章

  1. 1

    应用程序崩溃:Android Studio:使用If语句(INTENT)切换活动

  2. 2

    当我切换活动或关闭应用程序时,Android中的共享首选项不会保存

  3. 3

    切换活动时应用崩溃

  4. 4

    从应用程序主屏幕切换到其他活动时,应用程序崩溃

  5. 5

    切换屏幕时关闭android应用程序?

  6. 6

    使用超级+标签切换应用程序时使用箭头键

  7. 7

    切换node.js应用程序时localhost:3000不变

  8. 8

    切换应用程序时的Gnome 3.20图形故障

  9. 9

    在使用url方案切换应用程序时定期侦听事件的最佳实践

  10. 10

    Android:在两个活动之间切换错误-不幸的是,“应用程序名称”已停止

  11. 11

    为什么快速切换片段时我的应用程序崩溃?

  12. 12

    不能通过按切换键设置主题。应用程序不会崩溃

  13. 13

    切换至标签页时,应用程序崩溃

  14. 14

    数字登录应用程序不会切换活动吗?

  15. 15

    在活动之间切换时,Android App崩溃

  16. 16

    从cocos2d-x活动切换到Android上的另一个活动时,应用程序崩溃

  17. 17

    当我在活动之间切换时,我的应用程序闪烁并在后台显示以前的活动

  18. 18

    jQuery仅在刷新页面以切换Rails应用程序时有效

  19. 19

    在gnome-shell 3.2中从应用程序切换器中/在应用程序切换器中终止活动的应用程序进程

  20. 20

    通过单击选项卡(不滑动)在“滑动”选项卡之间切换时,应用程序崩溃

  21. 21

    在Android中以编程方式在应用程序图标之间切换

  22. 22

    如何在Android Studio中的应用程序栏上切换菜单图标

  23. 23

    切换应用程序后刷卡时,Android RecyclerView项目为空

  24. 24

    Android Studio-为什么“切换按钮”会关闭应用程序?

  25. 25

    设计两列Android应用程序-切换视图?

  26. 26

    在固定方向的中间应用程序之间切换-Android,AndEngine

  27. 27

    无法使用Appium for Android应用程序在WebView中切换

  28. 28

    尝试在Android 5.0上切换启动器时,我的应用程序关闭

  29. 29

    在应用程序内切换iCloud帐户

热门标签

归档