Как использовать runOnUiThread, не получая ошибку компилятора «не могу сделать статическую ссылку на нестационарный метод»

У меня есть основной класс;

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 

RunOnUiThread не является статическим методом.

Если вы хотите запустить runnable в UIThread, вы можете использовать это

Обработчик обработчика = новый обработчик (Looper.getMainLooper ());

Это создаст обработчик для потока пользовательского интерфейса.

 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 

Существует очень простое решение вышеупомянутой проблемы, просто сделайте статическую ссылку своей деятельности перед вашим onCreat()

 MainActivity mn; 

Затем инициализируйте его в onCreat() подобном этому

 mn=MainActivity.this; 

И после этого вам просто нужно использовать его для вызова вашего runOnUiThread

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

Надеюсь, что это сработает.

Вы можете получить экземпляр своей деятельности, передать ее службе и использовать ее вместо имени класса.

То вы можете использовать:

 yourActivity.runOnUiThread( ... 

Обычно мы используем этот метод (RunOnUiThread), когда мы пытаемся обновить наш пользовательский интерфейс из рабочего потока. Но поскольку вы используете Сервис здесь, runOnMainThread кажется неуместным в соответствии с вашей ситуацией.

Лучше использовать Handler здесь. Handler – это элемент, связанный с созданным потоком, вы можете отправить runnable с вашим кодом в обработчик, и этот runnable будет выполнен в потоке, где был создан Handler.

Создайте обработчик на своем сервисе в своем MainThread и опубликуйте Runnables на нем / отправьте ему сообщения.