如何在不挂起的情况下返回并恢复我的应用程序?

Posted

技术标签:

【中文标题】如何在不挂起的情况下返回并恢复我的应用程序?【英文标题】:How to navigate back and resume my app without hanging it? 【发布时间】:2016-04-04 00:07:25 【问题描述】:

当我在下面运行我的代码时,一切正常。当我想返回上一个活动(使用模拟器)时,我得到一个黑屏,然后应用程序关闭。当我退出应用程序并尝试恢复它时,我也会出现黑屏。

代码:

package com.example.bono.as3;

import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
import java.io.InputStream;

public class Main extends Activity 

    DrawView drawView;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        drawView = new DrawView(this);
        setContentView(drawView);
    

    @Override public void onResume()
        super.onResume();
        drawView.resume();
    

    @Override public void onPause()
        super.onPause();
        drawView.pause();
    

    public class DrawView extends SurfaceView implements Runnable

        Thread gameloop = new Thread();
        SurfaceHolder surface;
        volatile boolean running = false;
        AssetManager assets = null;
        BitmapFactory.Options options = null;
        Bitmap incect[];
        int frame = 0;

        public DrawView(Context context)
            super(context);
            surface = getHolder();
            assets = context.getAssets();
            options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;

            incect = new Bitmap[2];

            try 
                for (int n = 0; n < incect.length; n++)
                    String filename = "incect"+Integer.toString(n+1)+".png";
                    InputStream istream = assets.open(filename);
                    incect[n] = BitmapFactory.decodeStream(istream,null,options);
                    istream.close();
                
             catch (IOException e)
                e.printStackTrace();
            
        

        public void resume()
            running = true;
            gameloop = new Thread(this);
            gameloop.start();
        

        public void pause()
            running = false;
            while (true)
                try 
                    gameloop.join();
                
                catch (InterruptedException e)
            
        

        @Override public void run ()
            while (running)
                if (!surface.getSurface().isValid())
                    continue;
                Canvas canvas = surface.lockCanvas();
                canvas.drawColor(Color.rgb(85, 107, 47));
                canvas.drawBitmap(incect[frame], 0, 0, null);

                surface.unlockCanvasAndPost(canvas);

                frame++;

                if (frame > 1) frame = 0;

                try 
                    Thread.sleep(500);
                 catch (InterruptedException e)
                    e.printStackTrace();
                
            
        
    

我在日志中没有收到任何错误消息,我得到的是大约 13 条消息说“暂停所有线程花费:X ms”,所以我认为它与我的游戏循环线程有关。不幸的是,我没有看到我的代码中有什么问题......

【问题讨论】:

谁能帮我解决这个问题? 首先,在pause 中,当您捕获InterruptedException 时,打印堆栈跟踪,不要只是捕获它而什么都不做。这很危险。其次,当暂停时,您让gameloop 等待,但是onResume,您创建另一个新的thread 而不处理您等待的线程。所以我猜有时在暂停和恢复之后,你会有很多线程在等待。 【参考方案1】:

如果您需要上下文,请使用 getApplicationContext() 或 Activity.this。 (我的代码似乎没有那么错误)

返回之前使用的活动时,不会调用 onCreate(),仅调用 onResume(),因此如果您将以下行移到那里可能会有所帮助。 drawView = new DrawView(this); setContentView(drawView);

为什么要使用内部类? Activity 已经是一个类了。如果您想多次使用该代码,请将其单独设为一个类。

【讨论】:

【参考方案2】:

这是我用来导航回来的。也许这对你有用2!

Button backpressed = (Button) findViewById(R.id.btBack);
    backpressed.setOnClickListener(new View.OnClickListener() 
        public void onClick(View v) 
            onBackPressed();
        
    );

onBackPressed() 只是一个方法,如果你想返回到最后一页,你可以调用它。

对我来说是什么样的:

【讨论】:

感谢您的回答。在我所有的其他项目中,我不需要编写额外的代码来导航,所以我不明白为什么我现在需要它。无论如何,我会尝试你的解决方案。 @Taegos 我希望它可以工作,我对 android 比较陌生,所以我不知道它是否适用于每个 android 版本。 @Taegos 我的遮阳篷对你有帮助吗? 我真的没看懂,你为什么要在你的应用程序中添加一个新按钮来返回一个类或视图?我在所有项目中使用的是默认的后退按钮,它是 android GUI 的一部分,不需要额外的编码。在较旧的设备上,这通常是一个物理按钮,现在我指的是什么? @Taegos 我有一个按钮

以上是关于如何在不挂起的情况下返回并恢复我的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 cpu/内存使用情况或挂起的请求返回 503 服务器繁忙?

一文搞明白协程的挂起和恢复

一文搞明白协程的挂起和恢复

一文搞明白协程的挂起和恢复

如何调试在 Windows Phone 8.1 上挂起的应用程序

如何在没有 UI 挂起的情况下将 QtcpSockets 连接到大约 100 个服务器?