0

Android 开发者网站上曾说过:我们不应该在工作中使用长操作UIThread。相反,我们应该在另一个线程上进行。在这个网站上,他们仍然说:

如果 UI 线程被阻塞超过几秒(目前大约 5 秒),用户会看到臭名昭著的“应用程序无响应”(ANR)对话框。

为了检验这个说法,我做了一个证明。这是我的代码:

package com.app;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class Example extends Activity{
    TextView  textView;
    @Override 
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        textView = new TextView(this);
        textView.setText("please wait");
        setContentView(textView);

    }

    @Override
    public void onResume(){
        super.onResume();
        try {
            Thread.sleep(8000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        textView.setText("end waiting !!!");
    }

}

如您所见,我让当前线程 ( UIThread) 休眠 8 秒。所以,我想,如果我运行这个应用程序,Android 会注意到:“应用程序没有响应”。但是,我没有看到任何错误。程序运行顺利(我也看到文本“结束等待”)。

那么,谁能为我解释一下我的代码。请问我做错了什么。

谢谢 :)

4

2 回答 2

8

这里的问题是您不会生成任何被阻塞的信号/事件。当您或系统在这 5 秒内没有响应事件时,Android 会显示该对话框。没有事件意味着没有对话。

所以你的代码运行良好,直到你尝试做某事。如果我不做任何事情就运行您的代码,它就可以正常工作。如果我在开始时按菜单键生​​成事件,它将触发 ANR,因为无法正确处理键事件。

希望这有帮助:)

于 2012-02-25T17:42:24.047 回答
1

@hqt 在您的子问题中(对不起,我无法发表评论),如果您希望您的程序终止,请在您点击后button,当您button在 8 秒内运行时,您应该再次点击您的按钮,“魔术”将如你所愿发生:)

于 2012-02-26T03:39:23.120 回答