【问题标题】:How to fix continuous logcat message when starting new activity?如何在开始新活动时修复连续的 logcat 消息?
【发布时间】:2019-08-22 01:58:46
【问题描述】:

我正在用 java 创建一个 android 应用程序,并观看了 YouTube 频道 Android Authority 的教程,他用另一个 java 文件替换了启动活动的布局 .xml 文件。此外,活动扩展了 Activity 而不是 AppCompactActivity。我所做的一切都是一样的,并且正在尝试使用 Intent 和 startActivity(intent) 从这个活动开始另一个活动。然而,这样做会导致 logcat 输出一个连续的文本流,试图创建一个新的活动,但它永远不会成功,屏幕仍然在第一个活动上。

我已尝试启动另一个具有 .xml 布局文件的活动,并且成功了。似乎问题出在 .java 布局文件上。我没有在网上找到任何表明人们遇到同样问题的东西。

开始上课:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    setContentView(new MainMenuView(this));
}

MainMenuView 类:

public MainMenuView(Context context){
    super(context);
    mContext = context;
    activity = (Activity) mContext;
    intent = new Intent(activity.getBaseContext(), FileSelect.class);

    getHolder().addCallback(this);
    thread = new MainThread(getHolder(), this);
    setFocusable(true);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    thread.start();
}

public void newActivity(){
    if (thingy){ //assigned true when a button is pressed
        thingy = false; 
        mContext.startActivity(intent);
        activity.finish();
    }
}

二等:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    setContentView(new FileSelectView(this));
}

FileSelectView 类:

public FileSelectView(Context context){
    super(context);
    mContext = context;
    activity = (Activity) mContext;
    getHolder().addCallback(this);

    thread = new MainThreadTwo(getHolder(), this);
    setFocusable(true);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    thread.start();
}

MainThread 类(MainThread 和 MainThreadTwo 几乎相同):

public class MainThread extends Thread {
    private SurfaceHolder surfaceHolder;
    private MainMenuView mainMenuView;
    private boolean running = true;
    private static Canvas canvas;

    MainThread(SurfaceHolder surfaceHolder, MainMenuView mainMenuView){
        super();
        this.surfaceHolder = surfaceHolder;
        this.mainMenuView = mainMenuView;
    }

    @Override
    public void run() {
        long startTime;
        long timeBillis;
        long waitTime;
        int targetFPS = 30;
        long targetTime = 1000 / targetFPS;

        while (running){
            startTime = System.nanoTime();
            canvas = null;

            try {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized(surfaceHolder){
                    if (mainMenuView != null && canvas != null) {
                        this.mainMenuView.update();
                        this.mainMenuView.draw(canvas);
                    }
                    if (canvas != null){
                        surfaceHolder.unlockCanvasAndPost(canvas);
                    }
                    if (mainMenuView != null){
                        this.mainMenuView.newActivity();
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }

            timeBillis = System.nanoTime() - startTime;
            waitTime = targetTime - timeBillis;

            if (timeBillis < targetTime) {
                try {
                    this.sleep(waitTime);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

当使用 .xml 文件布局启动一个类时,在调用 startActivity(intent) 之后,logcat 会打印一些以下消息,并且屏幕会更新到新的活动。使用我使用的设置,在调用 startActivity(intent) 之后,logcat 会在打印出以下块之间无休止地交替:

D/ViewRootImpl@ca0f529[FileSelect]: ThreadedRenderer.create() translucent=false
D/InputTransport: Input channel constructed: fd=78
D/ViewRootImpl@ca0f529[FileSelect]: setView = DecorView@1f110ae[FileSelect] touchMode=true

“fd=”数字加一,并且:

D/ViewRootImpl@3ed1b35[MainMenu]: dispatchAttachedToWindow
D/ViewRootImpl@3ed1b35[MainMenu]: Relayout returned: oldFrame=[0,0][0,0] newFrame=[0,0][1280,800] result=0x1 surface={isValid=false 0} surfaceGenerationChanged=false

如果有人能理解这里发生的事情,那真的很有帮助,如果有人不理解问题的某些部分,我会尝试帮助/改写。为什么这些输出消息不断出现,为什么没有出现新的活动?

【问题讨论】:

    标签: java android android-activity


    【解决方案1】:

    您需要将变量 running 设置为 false,在您的 while(在您的 MainThread 类中)达到某个条件后。您的应用进入了无限循环,这就是为什么您的日志有很多消息并且没有出现活动的原因。

    【讨论】:

    • 不,我试过了,消息仍然继续,活动没有出现。我在线程的 while 循环中使用 System.out.println("foo") 来检查日志并查看线程是否仍在运行。线程停止,logcat 消息继续。
    • 很抱歉没能帮到你。。一个觉得奇怪的是this.mainMenuView.newActivity(),因为它看起来会再次调用startActivity并进入在 MainThread 循环中一次又一次。
    • 嗯,我觉得有趣的是,我可以从 XML 文件布局活动启动启动活动类,但当我尝试启动第二个类时会出现同样的问题。这让我觉得我尝试启动的课程有问题,但我无法弄清楚它与第一个活动有何不同。
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2018-04-11
    相关资源
    最近更新 更多