Android Apps: получит ли «приложение не отвечающее» после того, как блок UIThread будет более 5 секунд - PullRequest
0 голосов
/ 25 февраля 2012

На сайте разработчиков Android сказано, что: Мы не должны использовать длительные операции в UIThread.Вместо этого мы должны сделать это в другом потоке.На этом сайте все еще говорят:

, если поток пользовательского интерфейса заблокирован на более чем несколько секунд (в настоящее время около 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 заметит: «приложение не отвечает».Но я не вижу никакой ошибки.Программа работает без сбоев (и я вижу текст "ожидание окончания").

Итак, кто может объяснить мне мой код.Какую неправильную вещь я сделал, пожалуйста.

спасибо:)

Ответы [ 2 ]

8 голосов
/ 25 февраля 2012

Проблема в том, что вы не генерируете сигнал / событие, которое блокируется. Android отображает это диалоговое окно, когда вы или система не реагируете на событие в течение этих 5 секунд. Отсутствие события означает отсутствие диалога.

Так что ваш код работает нормально, пока вы не попытаетесь что-то сделать. Если я запускаю ваш код, ничего не делая, он работает без проблем. Если я сгенерирую событие при нажатии клавиши меню в начале, это вызовет ANR, потому что ключевое событие не может быть обработано должным образом.

Надеюсь, эта помощь:)

1 голос
/ 26 февраля 2012

@ hqt в вашем подвопросе (извините, что я не могу оставлять комментарии), если вы хотите, чтобы ваша программа была прервана, после того, как вы нажали button, когда ваш button через 8 секунд, вы должны нажать сноватвоя кнопка, и "волшебство" произойдет как ты пожелаешь :) 1003 *

...