13

メインクラスがあります。

  ClientPlayer extends Activity {

そしてサービス

  LotteryServer extends Service implements Runnable {

このサービスの実行メソッドで RunOnUiThread を使用しようとすると、「非静的メソッドへの静的参照を作成できません」というコンパイラ エラーが発生します。

これを修正する方法、コードの使用方法をここに示します。

     @Override
public void run() {
   // I tried both ClientPlayer.runOnUiThread and LotteryServer.runOnUiThread
   // both don't work   
    ClientPlayer.runOnUiThread(new Runnable() {
        public void run() {
           Toast.makeText(getApplicationContext(), "from inside thread", Toast.LENGTH_SHORT).show();
        }
    });
} // end run method
4

4 に答える 4

20

runOnUiThread は静的メソッドではありません。

UIThreadでランナブルを実行したい場合は、これを使用できます

ハンドラ handler = new Handler(Looper.getMainLooper());

これにより、UI スレッドのハンドラーが作成されます。

ClientPlayer extends Activity {
.
.
public static Handler UIHandler;

static 
{
    UIHandler = new Handler(Looper.getMainLooper());
}
public static void runOnUI(Runnable runnable) {
    UIHandler.post(runnable);
}
.
.
.
}

これでどこでも使用できます。

@Override
public void run() {
   // I tried both ClientPlayer.runOnUiThread and LotteryServer.runOnUiThread
   // both don't work   
    ClientPlayer.runOnUI(new Runnable() {
        public void run() {
           Toast.makeText(getApplicationContext(), "from inside thread", Toast.LENGTH_SHORT).show();
        }
    });
} // end run method
于 2013-02-21T07:37:18.387 に答える
13

onCreat()メソッドの前にアクティビティの静的参照を作成するだけで、上記の問題に対する非常に簡単な解決策があります

MainActivity mn;

次に、onCreat()このようにメソッドで初期化します

mn=MainActivity.this;

その後は、それを使用してあなたのrunOnUiThread

mn.runOnUiThread(new Runnable() {
                    public void run() {
                        tv.setText(fns);///do what
                                    }
                                });

それがうまくいくことを願っています。

于 2015-06-05T09:59:55.710 に答える
5

アクティビティのインスタンスを取得してサービスに渡し、クラス名の代わりにそれを使用できます。

次に、次を使用できます。

yourActivity.runOnUiThread( ...
于 2013-02-21T07:27:48.127 に答える
0

通常、動作中のスレッドからUIを更新しようとするときに、このメソッド(RunOnUiThread)を使用します。ただし、ここでサービスを使用しているrunOnMainThreadため、状況に応じて不適切と思われます。

ここでハンドラーを使用することをお勧めします。ハンドラーは、作成されたスレッドに関連付けられた要素です。コードを含むランナブルをハンドラーに投稿できます。そのランナブルは、ハンドラーが作成されたスレッドで実行されます。

MainThreadでサービスにハンドラーを作成し、Runnablesを投稿/メッセージを送信します。

于 2013-02-21T07:27:37.047 に答える