为啥我的应用程序在从自定义视图启动 Activity 后关闭?

Posted

技术标签:

【中文标题】为啥我的应用程序在从自定义视图启动 Activity 后关闭?【英文标题】:Why is my application closing after starting Activity from custom View?为什么我的应用程序在从自定义视图启动 Activity 后关闭? 【发布时间】:2018-03-04 22:35:28 【问题描述】:

我正在 android Studio 中开发一个简单的游戏,我正在调用 GameOver 活动,并使用“重试”按钮形成游戏活动(刚刚命名为 MainActivity)。当主角与其中一个怪物发生碰撞时会调用它。我的问题是,当我尝试通过((Activity)getContext()).finish(); 完成时,我的应用程序关闭而不是开始新活动。这是启动它的方法:

public void isCharacterDead()
    for (Monster item : monsters) 
        if (characters.get(0).deadCollision.contains(item.collision.centerX(), item.collision.centerY())) 
            player.stop();
            long gameOverDelayEnd = (System.nanoTime()/1000000)+1000;
            long gameOverDelayStart = System.nanoTime()/1000000;

            while(gameOverDelayStart < gameOverDelayEnd)
                gameOverDelayStart = System.nanoTime()/1000000;

                
            characters.remove(0);

            Intent gameOver = new Intent(getContext(),GameOver.class);
            gameOver.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            ((Activity)getContext()).finish();
            getContext().startActivity(gameOver);

            
    

我的 GameOver Activity 是:

public class GameOver extends Activity 
    private Button tryAgain;
    @Override
    protected void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //removing the title from the screen in order to have empty screen
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
        setContentView(R.layout.activity_game_over);

        tryAgain = (Button) findViewById(R.id.tryagain);
        tryAgain.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                Intent game = new Intent(GameOver.this, MainActivity.class);
                GameOver.this.finish();

                startActivity(game);

            
        );
    

现在,如果我不使用((Activity)getContext()).finish();,它将启动 GameOver 活动,当单击 Try Again 时,我将移动到 Game Activity(MainActivity) 的新实例。但它会通过 GameOver 中的“重试”按钮降低每次新开始时的性能。我想这是由于在最后一个游戏中开始新游戏活动而没有完成它。关于如何避免这种情况的任何建议? android 监视器内没有任何异常(我的 GPU 监视器也被禁用)。

【问题讨论】:

你为什么使用 Intent.FLAG_ACTIVITY_NEW_TASK 以及你的代码是在哪里写的? getContext() 方法是如何工作的? isCharacterDead() 在自定义视图中。在更新精灵位置的每一帧之后调用它。 【参考方案1】:

尝试交换这两行:

((Activity)getContext()).finish();
getContext().startActivity(gameOver);

并且在开始活动时不要忘记break for 循环

编辑:

编辑您的问题添加完整代码后,现在可以清楚地知道原因 你的问题:

您正在从您创建的线程中调用upd 方法,upd 又调用正在完成活动的方法isCharacterDead,但不允许从除 UI 线程之外的任何线程访问任何 UI 元素.

您可以使用runOnUiThread 修复它:

将启动活动和停止当前的行替换为以下内容:

((Activity)getContext()).runOnUiThread(new Runnable() 

        @Override
        public void run() 
              Intent gameOver = new Intent(getContext(),GameOver.class);
              gameOver.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              getContext().startActivity(gameOver);
              ((Activity)getContext()).finish();
        
 );

【讨论】:

我交换了它们,但它仍然是一样的 - 应用程序自行关闭,没有任何消息或任何东西。如果我没有从 GameOver 每次新开始都完成活动,则模拟器上的性能会损坏,在真实设备上,它甚至会在第 4 次使用时关闭应用程序。如果更清楚,MainActivity 会启动 GameScreen 视图,我在其中调用 GameOver 活动,如问题所示。 如果重要,我的清单如下所示:&lt;activity android:name=".GameActivity"&gt; &lt;intent-filter&gt; &lt;action android:name="android.intent.action.MAIN" /&gt; &lt;category android:name="android.intent.category.LAUNCHER" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; &lt;activity android:name=".MainActivity" android:theme="@android:style/Theme.Translucent"&gt;&lt;/activity&gt; &lt;activity android:name=".GameOver" android:theme="@android:style/Theme.Translucent" &gt;&lt;/activity&gt; 你能发布 logcat 以便我们更好地帮助你 这是 logcat - CLICK 这是在我按照您的答案交换代码之后。 GameOver 活动根本不显示。如果我没有在自定义视图中完成游戏活动,则会显示游戏结束屏幕。 而THIS 是当我没有((Activity)getContext()).finish(); 代码行的时候。在 Game Over 活动中第五次点击 Try Again 按钮后,我收到此错误。

以上是关于为啥我的应用程序在从自定义视图启动 Activity 后关闭?的主要内容,如果未能解决你的问题,请参考以下文章

为啥从自定义 UIView 向 UIButton 添加子视图不显示添加的子视图?

使用微调器从自定义列表视图中删除了错误的行

Django Ajax 403 仅在从自定义 localhost url 发布时

从自定义 NSObject 内部视图推送导航应用程序中的新视图

如何判断 UITabBar 是不是从自定义视图打开?

使用 sqliteDatabase 从自定义列表视图中删除项目