当前位置: 首页 > 知识库问答 >
问题:

Android-main方法中的活动导致程序崩溃到黑屏,但没有给出错误

苍志文
2023-03-14

早些时候,我遇到了一个问题,从我的splash page活动转到我的主活动(ColorMatch.java)会导致程序无限期地卡在黑屏上。我发现这是由于在我的主活动的onCreate中调用了run()方法。我尝试注释掉某些东西,看看它是否有效,但是只要在我的onCreate中调用run(),它就会自动进入黑屏,甚至没有给出一个错误让我进行故障诊断。是什么导致了这个问题?

My ClassMatch.java:

package com.example.ali.colormatch;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.os.Bundle;
import android.app.Activity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.Random;

public class ColorMatch extends AppCompatActivity {

int answer; //1 = red, 2 = blue, 3 = green, 4 = yellow
TextView textView3, textView2;
int count = 0;
volatile boolean playing = true;
private long timeThisFrame;
private Button testButton;
long fps;
int score;
int correctAnswer;
boolean matchColor = true, matchText = false;
long startFrameTime;
boolean firstTime = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_color_match);
    textView3 = (TextView) findViewById(R.id.textView3);
    textView2 = (TextView) findViewById(R.id.textView2);

    run();
}

public void run() {
    while (playing) {

        startFrameTime = System.currentTimeMillis();

        if (firstTime){
            generateNewWord();
            firstTime = false;
        }

        if (answer == correctAnswer){
            score++;
            count++;
            generateNewWord();}
        //else {
         //   quit();
       // }


        if (count % 5 == 0){
                if (matchColor) {
                    textView3.setText(getString(R.string.gameSetting2)); // might need to add context with this - check http://stackoverflow.com/questions/10698945/reference-string-resource-from-code
                    matchColor = true;
                    matchText = false;
                }
                else if (matchText){
                    textView3.setText(getString(R.string.gameSetting1));
                    matchText = true;
                    matchColor = false;
                }
            }
        }

        //draw();
        timeThisFrame = System.currentTimeMillis() - startFrameTime;
        if (timeThisFrame > 0) {
            fps = 1000 / timeThisFrame;
        }

    }

public void generateNewWord(){

    //randomly select between red, green, blue, yellow
    Random rand = new Random();
    int randomInt1 = rand.nextInt(4) + 1; // assigns randomInt a value between 1 - 4
    int randomInt2 = rand.nextInt(4) + 1;

    if (randomInt1 ==1){
        textView3.setText(R.string.Red);
    }
    else if (randomInt1 ==2){
        textView3.setText(R.string.Green);
    }
    else if (randomInt1 == 3){
        textView3.setText(R.string.Blue);
    }
    else if (randomInt1 == 4){
        textView3.setText(R.string.Yellow);
    }


    //randomly select hex codes between rgby
    if (randomInt2 ==1){
        textView3.setTextColor(0xffcc0000);
    }
    else if (randomInt2 ==2){
        textView3.setTextColor(0xff669900);
    }
    else if (randomInt2 == 3){
        textView3.setTextColor(0xff000080);
    }
    else if (randomInt2 == 4){
        textView3.setTextColor(0xffffff00);
    }


   if (matchColor) {
        correctAnswer = randomInt2;
    }
    else if(matchText){
        correctAnswer = randomInt1;
    }

}
public void quit(){

}


public void sendBlue(View view){
    answer = 2;
}
public void sendRed(View view){
    answer = 1;
}
public void sendYellow(View view){
    answer = 4;
}
public void sendGreen(View view){
    answer = 3;
}


}

它使用的activity_color_match.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_color_match"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.ali.colormatch.ColorMatch">

<TextView

    android:text="@string/matchText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textView3"
    android:textAppearance="@style/TextAppearance.AppCompat.Body2"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<TextView
    android:text="@string/mainColor"
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:textColor="@android:color/background_dark"
    android:textSize="100dp"
    android:layout_marginBottom="104dp"
    android:textAppearance="@style/TextAppearance.AppCompat.Display3"
    android:layout_above="@+id/button3"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="150dp"
    android:layout_height="60dp"
    android:id="@+id/button"
    android:background="#000080"
    android:onClick="sendBlue"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<Button
    android:layout_height="60dp"
    android:id="@+id/button2"
    android:background="@color/yellow"
    android:elevation="0dp"
    android:layout_width="150dp"
    android:onClick="sendYellow"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<Button
    android:layout_width="150dp"
    android:layout_height="60dp"
    android:id="@+id/button3"
    android:background="@android:color/holo_red_dark"
    android:onClick="sendRed"
    android:layout_above="@+id/button"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="19dp" />

<Button
    android:layout_width="150dp"
    android:layout_height="60dp"
    android:id="@+id/button4"
    android:background="@android:color/holo_green_dark"
    android:onClick="sendGreen"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_alignBottom="@+id/button3" />


</RelativeLayout>

为了完整起见,虽然我认为这可能是不相关的,这里是我的MainActivity.java。它似乎如我所愿地工作着:

package com.example.ali.colormatch;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends AppCompatActivity {

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

public void onSplashPageClick(View view){
    Intent intent = new Intent(MainActivity.this, ColorMatch.class);
    startActivity(intent);
}

public void onQuitClick(View view){
    finish();
}
}

我正在使用Nexus 5启动我的应用程序并进行调试。谢谢你。

共有2个答案

潘辰龙
2023-03-14

我认为您可以在onCreate()中创建一个线程,并将方法“run()”放入该线程。

试试看:

           new Thread(new Runnable() {
                @Override
                public void run() {
                    ColorMatch.this.run();
                }
            }).start();

**编辑**

原因是你在 onCreate 时在 ui 线程(主线程)中做了太多的事情,如果你在 onCreate 方法中浪费了太多时间,那将是 ANR(活动无响应),你需要把浪费时间的任务放在后台线程中。它将避免在创建活动时出现黑屏。

施琦
2023-03-14

嘿,如果你仍然在寻找一种方法来不时刷新视图,那么你可以使用定时器。

看看这个答案https://stackoverflow.com/a/18353754/2311117.这解释了如何使用计时器。

有关计时器和计时器任务的详细信息。

 类似资料:
  • 我正在使用来自ViewPager(在调用活动中)的活动转换,以及共享元素和内容转换。我得到这个崩溃时,重新进入调用活动: 此外,一旦返回,屏幕开始持续闪烁,白色屏幕来回闪烁。 以下是我的转换标志: 我尝试在调用和调用活动上设置进入/退出转换,但没有运气。

  • 我试图从我的框架中获得轮廓,这就是我所做的: .................................................... 程序在处崩溃,我收到以下错误消息: OpenCV错误:不支持的格式或格式组合([开始]FindContour只支持8uC1和32sC1图像)在未知的功能,文件......\src\openc v\模块\imgproc\src\contours.cp

  • 问题内容: 我正在开发一个Android 3.1应用程序,该应用程序使用USB主机模式通过USB上的MIDI与我的键盘(Korg M3)进行通信。这是在装有Android 4.0.3的Xoom上运行的。我可以通过USB接收MIDI消息而没有任何问题,但是将音符数据发送回键盘的效果是好坏参半,延迟半秒钟后便会频繁崩溃。 这是我在点击操作栏上的按钮发送注释时不断遇到的错误: E / dalvikvm(

  • 我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩

  • 我正在尝试使用、和(不使用)实现实时相机应用程序 所以,我发现这篇教程 http://altitudelabs.com/blog/real-time-filter/ 它是用Objective-C编写的,所以我在Swift4.0中重写了那个代码,xcode9 它看起来工作很好,但有时(很少),它崩溃了以下错误。调用的方法时 EXC_BAD_ACCESS(代码=1,地址+0x************)

  • 这里是Android开发者新手。我在MainActivity中使用recyclerview,应用程序不断崩溃。 任何帮助都将受到赞赏! 编辑:对不起,我是新来的。我已经附加了Logcat。和其他xml文件。谢谢 这是我的代码: 列出你的布局。xml: activity_main.xml: } ProductAdapter。java类: } Logcat: 致命异常:主进程:e.wolverine2