2012-02-25 10 views
0

Androidデベロッパーサイトでは、UIThreadで長時間操作を使用しないでください。代わりに、別のスレッドで実行する必要があります。このサイトでは、彼らはまだ言う:Android Apps:UIThreadブロックの後に5秒後に「アプリケーションが応答しません」と表示されますか?

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秒に眠ります。だから私は、私はこのアプリを実行すると、アンドロイドは気づくでしょう: "アプリケーションが応答していません"。しかし、私はどんな誤りも見ない。プログラムはスムーズに実行されます(また、テキスト「end waiting」も参照してください)。

私のコードについて、私の説明があります。何を私が作った間違ったことをしてください。

感謝:)

答えて

1

@hqtしたい場合は、あなたのプログラムが終了し、あなたのbuttonをクリックした後、とき8-seconds-でごbuttonあなたは、あなたのボタンをもう一度クリックする必要があり、あなたが望むように "魔法"が起こるでしょう:)

8

ここでの問題は、あなたがブロックされる任意の信号/イベントを生成しないということです。あなたまたはシステムがこれらの5秒以内にイベントに応答しない場合、Androidはそのダイアログを表示します。イベントは何もダイアログを意味しません。

何かをしようとするまで、あなたのコードは正常に動作します。何もせずにコードを実行すると、問題なく動作します。起動時にメニューキーを押してイベントを生成すると、キーイベントが正しく処理できないため、ANRがトリガーされます。

・ホープ、このヘルプ:)あなたのサブ質問(私がコメントを投稿することができないのが残念)で

+0

OPが5秒以上UIスレッドをブロックするものを実行しようとする場合、理想的にはAsyncTaskに入るはずです。 – Knossos

+2

@alextsc詳細な例を教えてください。私は新しい 'ボタン 'を作成し、それを' onRefresh'イベントにします。その後、私がアプリを起動するときに、私はその 'Button'を押しますが、それでも問題は起こりません。リフレッシュのためにここに私のコード: – hqt

+2

ます。public void onRefresh(ビュービュー){ \t \t試し{ \t \t \tのThread.sleep(8000); \t \t}キャッチ(InterruptedExceptionある電子){} \t \t \t \t textView.setText( "待機終了!!!")。 \t \t \t} – hqt

関連する問題