how to use runOnUiThread without getting “cannot make a static reference to the non static method” compiler error

后端 未结 4 581
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-13 15:53

I have a main class;

  ClientPlayer extends Activity {

and a service

  LotteryServer extends Service implements Runnable {


        
相关标签:
4条回答
  • 2021-02-13 15:59

    There is a very simple solution to the above problem just make a static reference of your Activity before your onCreat() method

    MainActivity mn;
    

    then initialize it in you onCreat() method like this

    mn=MainActivity.this;
    

    and after that you just have to use it to call your runOnUiThread

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

    hope it work.

    0 讨论(0)
  • 2021-02-13 15:59

    You can get the instance of your Activity, pass it to the service, and use that instead of the class name.

    then you can use:

    yourActivity.runOnUiThread( ...
    
    0 讨论(0)
  • 2021-02-13 16:08

    Generally we use this method(RunOnUiThread) when we try to update our UI from a working thread. but As you are Using Service Here, runOnMainThread is seems inappropriate as per your situation.

    Better to Use Handler here. Handler is an element associated to the thread where is created, you can post a runnable with your code to the Handler and that runnable will be executed in the thread where the Handler was created.

    Create a Handler on your Service in his MainThread and post Runnables on it / send messages to it.

    0 讨论(0)
  • 2021-02-13 16:20

    runOnUiThread is not a static method.

    If u want to run your runnable on UIThread You can use this

    Handler handler = new Handler(Looper.getMainLooper());

    This will create a handler for UI Thread.

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

    Now u can use this anywhere.

    @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
    
    0 讨论(0)
提交回复
热议问题