0

サービス内にこのタイマーがあり、完全に機能し、カウントされます...しかし、いくつかの非同期タスクを呼び出すと、エラーが発生します!!

Timer time = new Timer(); // Instantiate Timer Object
    time.schedule(new TimerTask(){
        public void run() {
                // i call my Asyntasks here
       }
    },5000,5000);

これは私にエラーを与えます:

03-17 02:02:27.167: E/AndroidRuntime(925): FATAL EXCEPTION: Timer-0
03-17 02:02:27.167: E/AndroidRuntime(925): java.lang.ExceptionInInitializerError
03-17 02:02:27.167: E/AndroidRuntime(925):  at      Dic.proj.pkg.notifService$1.run(notifService.java:57)
  03-17 02:02:27.167: E/AndroidRuntime(925):    at    java.util.Timer$TimerImpl.run(Timer.java:289)
  03-17 02:02:27.167: E/AndroidRuntime(925): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  03-17 02:02:27.167: E/AndroidRuntime(925):    at android.os.Handler.<init>(Handler.java:121)
  03-17 02:02:27.167: E/AndroidRuntime(925):    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
  03-17 02:02:27.167: E/AndroidRuntime(925):    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
   03-17 02:02:27.167: E/AndroidRuntime(925):   at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
   03-17 02:02:27.167: E/AndroidRuntime(925):   ... 2 more

Log.d("message"); のような他の指示を入れた場合 すべてがうまくいく

4

3 に答える 3

2

AsynchTaskは、UI スレッドまたは少なくともルーパーを備えたスレッドから作成/呼び出して、タスクが呼び出し元スレッドに何かを発行したい場合などにコールバックを処理する必要がありますonPostExcute()...独自のスレッドで実行されるTimerオブジェクトを使用すると、この条件を満たす。

これを実現するには、 HandlerとTimerを組み合わせて使用​​するか、handler オブジェクトを使用して独自のタイマーを作成することをお勧めします。

最初のアイデアは次のようになります。

final Handler handler = new Handler();
Timer time = new Timer(); // Instantiate Timer Object
time.schedule(new TimerTask(){
    public void run() {
            handler.post(new Runnable(){
            // i call my Asyntasks here
             });
   }
},5000,5000);

ハンドラーとタイマーの詳細については、こちらをご覧ください。

タイマー

非同期タスク

ここにスレッドに関する優れたチュートリアルがあります: チュートリアル

于 2013-03-17T07:52:33.020 に答える
1

AsyncTasks を開始するには、UI スレッド内にいる必要があるようです。

Timer の代わりにHandler.postDelayed(Runnale, long)を使用してみることができます。

于 2013-03-17T07:45:47.647 に答える
1

AsyncTask クラスを UI スレッドにロードする必要があります。これは、JELLY_BEAN の時点で自動的に行われます。

タスク インスタンスは、UI スレッドで作成する必要があります。

新しいスレッドを作成しています。ハンドラーを使用します。メインスレッドで実行

private Handler handler = new Handler();
Runnable task = new Runnable() {
@Override
public void run() {
    //do something
    handler.postDelayed(this, 100000);
}
};
handler.removeCallbacks(task);
handler.post(task);

http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-03-17T07:54:37.080 に答える