2017-02-26 15 views
-1

このクラスでタイマーを管理しているとします。単なるテストです。Looper.Perare error on Timer

package it.rockopera.scsremote; 
import android.content.Context; 
import java.util.Timer; 
import java.util.TimerTask; 

public class CueTimer extends Thread{ 
    private Context context; 
    private MainActivity main = new MainActivity(); 
    private Timer timer; 
    int elapsed = 0 ; 

    public CueTimer(Context c){ 
     context= c; 
     timer = new Timer(); 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       elapsed+=1000; 
       System.out.println("elapsed: " + String.valueOf(elapsed));     
      } 
     },0,1000); //Update text every second 
    } 
} 

私は、このように別のクラスからこのメソッドを呼び出すしたいと思います:

CueTimer cuetimer = new CueTimer(context); 
cuetimer.start() 

はここでエラーです:

Process: it.rockopera.scsremote, PID: 7562 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.(Handler.java:200) at android.os.Handler.(Handler.java:114) at android.app.Activity.(Activity.java:789) at it.rockopera.scsremote.MainActivity.(MainActivity.java:47) at it.rockopera.scsremote.CueTimer.(CueTimer.java:32) at it.rockopera.scsremote.Client$Read_SCS_MSGs.run(Client.java:477) at java.lang.Thread.run(Thread.java:761)

「私はこのエラーを探すためにしようとしたが、私はすることができます何か類似のものを見つける。 ありがとうございます!

+1

あなたはcuetimer.start()を呼び出しているクラスから、CueTimerの完全なクラスコードとクラスを与えることができますか? –

+0

'main = new MainActivity();'あなたはあなた自身で活動のインスタンスを作成することはできません。それをシステムに任せてください。 – njzk2

+0

私はmain = new MainActivity()にコメントしました。このメソッドでは使用されていないため、 –

答えて

0

それぞれの新しいスレッドを使用すると、Handler

Threads by default do not have a message loop associated with them; to ?create one, call prepare() in the thread that is to run the loop, and then loop() to have it process messages until the loop is stopped.

を使用したいしかし、あなたのコード内の問題が実際にこのラインで場合にLooper.prepere()を呼び出す必要があります:

private MainActivity main = new MainActivity(); 

二つの問題が実際にあります。まず、CueTimerをメインスレッドに作成しないと、MainActivityのインスタンス化がメインスレッドにも発生していないように見えます。 2番目 - アクティビティを直接インスタンス化することはありません。あなたの活動はAndroidManifest.xmlに登録し、Intentからアクセスする必要があります。

+0

私はプライベートMainActivity main = new MainActivity()にコメントしました。 CueTimerメソッドでは使用されていないためです。 –

+0

提案されたコードのどこでLooper.prepare()を呼び出す必要がありますか? –

+0

提案されたコードは、手動で「アクティビティ」を作成したため有効ではありません。それを排除すれば 'Looper.prepare()'を呼び出す必要はありません。 – j2ko