【问题标题】:My app always crashes when starting a second activity within an onClick method在 onClick 方法中启动第二个活动时,我的应用程序总是崩溃
【发布时间】:2016-09-01 09:15:53
【问题描述】:

我的应用有两个活动:MainActivity 和 DrawingActivity。在 MainActivity 中显示了一个按钮,在 DrawingActivity 中显示了 GLSurfaceview 上的相机预览。这个想法是,当你启动应用程序时,首先运行 MainActivity,当你按下按钮时,你跳转到初始化相机并显示相机预览的 DrawingActivity。为此,我尝试在附加到按钮的onClickLIstener 回调中定义一个intent 对象。问题是每次我按下按钮时,我的应用程序都会通过在 GLSurfaceView 类上调用 private void stopEglSurfaceLocked() 方法而崩溃。

有趣的是,如果我在onClick 方法之外定义intent,一切正常。

以下是一些相关代码:

主活动:

public class MainActivity extends Activity {

private Button btnStart;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    btnStart = (Button) findViewById(R.id.btnDisplay);

    btnStart.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

        Intent intent = new Intent(MainActivity.this, DrawingActivity.class);
        MainActivity.this.startActivity(intent);
        finish();

        }
    });

  }

Manifest.xml:

<application
    android:name="com.example.opengltest.AssetsCache"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" 
    android:largeHeap="true">
    <activity
        android:name="com.example.opengltest.MainActivity"
        android:label="@string/app_name" 
        android:screenOrientation="landscape">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:label="@string/app_name"
        android:name="com.example.opengltest.DrawingActivity"
        android:screenOrientation="landscape">
    </activity>
</application>

这是错误的堆栈跟踪:

09-01 12:03:04.117: E/AndroidRuntime(13981): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.SurfaceTexture.updateTexImage()' on a null object reference
09-01 12:03:04.117: E/AndroidRuntime(13981):    at com.example.opengltest.DrawingActivity.onNewFrame(DrawingActivity.java:526)
09-01 12:03:04.117: E/AndroidRuntime(13981):    at com.google.vrtoolkit.cardboard.CardboardView$StereoRendererHelper.onDrawFrame(CardboardView.java:289)
09-01 12:03:04.117: E/AndroidRuntime(13981):    at com.google.vrtoolkit.cardboard.CardboardView$RendererHelper.onDrawFrame(CardboardView.java:598)
09-01 12:03:04.117: E/AndroidRuntime(13981):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1531)
09-01 12:03:04.117: E/AndroidRuntime(13981):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)

重要提示: 虽然在 DrawingActivity 类中似乎有问题,但事实并非如此。如果我将绘图活动类作为主类,所以在开始时调用它(没有意图),一切都很好。毫无疑问,DrawingActivity 类不是罪魁祸首,一切似乎都表明问题出在意图上。我正在做一些事情,使得 DrawingActivity 类没有按照它应该运行的方式运行。

【问题讨论】:

  • 你能分享你的错误日志吗
  • 您确定崩溃是因为开始第二个活动还是与第一个有关?请分享崩溃日志
  • 你能分享你的 DrawingActivity 和你的错误日志吗?
  • 我发布了错误日志。我理解错误,空指针,我不明白为什么只有当我在 onclicklisterner 回调中启动活动时才会发生此错误...
  • 09-01 12:03:04.117: E/AndroidRuntime(13981): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.SurfaceTexture.updateTexImage()' on a null object reference 错误来自您的 DrawingActivity 类,请也发布该类。

标签: android button android-intent onclick onclicklistener


【解决方案1】:

您已将onClickListener 设置为:

btnStart.setOnClickListener(new OnClickListener() {
 ...

这是不正确的,在Android中使用它来处理点击一个视图:

btnStart.setOnClickListener(new View.OnClickListener() {
 ...

阅读更多:View.OnClickListener

只需在 onClick 方法中开始你的意图:

Intent intent = new Intent(MainActivity.this, DrawingActivity.class);
startActivity(intent);
finish();

【讨论】:

  • 嗯,感谢您的回复,但即使您提出了更改建议,问题仍然存在:(
  • 该错误表明您的 DrawingActivity 存在问题,请在您的问题中发布您的 DrawingActivity 代码。
【解决方案2】:

使用 try/catch/finally 块启动 DrawingActivity 并完成 MainActivity :

btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try
            {
                //Try starting the Drawing activity
                Intent intent = new Intent(MainActivity.this, DrawingActivity.class);
                startActivity(intent);
            }
            catch(Exception ex)
            {
                //A problem occured, check Logcat
                ex.printStackTrace();
            }
            finally 
            {
                //DrawingActivity successfully started
                //So, finish the MainActivity
                finish();
            }
        }
    });

【讨论】:

  • 您好,这与您的意图无关,我们需要 DrawingActivity 类的代码吗?只需分享它,以便我们为您提供帮助;)
  • 不幸的是,我不允许共享此代码,我知道这太糟糕了……但是,我认为问题不存在。正如我所说,如果我将意图定义和 startactivity 方法移到 onClickListenerMethod 之外,它会正常工作。 DrawingActivity 没有问题,事实上这个类作为主要活动已经工作了好几个月没有任何问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2020-10-19
  • 2021-03-27
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
相关资源
最近更新 更多