Intereting Posts
Предотвратить показ приложения в последнем списке приложений в Android-Kitkat 4.4.2 Могу ли я исключить региональные ресурсы (например, значения-fr) при создании конкретного продукта Android Product с градиентом Каков наилучший способ обхода неопределенного перехода в ICS? TextView setGravity () не работает в java Android Maps V2: заливка полигона исчезает при масштабировании Переопределение onOptionsItemSelected from SherlockFragmentActivity Какая пусковая установка работает? Динамически обновлять список с помощью адаптера Может ли bluetooth или wifi-поток (spp) когда-либо пропускать байты или иметь поврежденные? Как получить SharedPreferences из PreferenceActivity в Android? Сбой при скрытии Что возвращает EditText.getText () в android, если он пуст? Пользовательские представления Android с Kotlin Что такое основное использование «Добавить метод контракта на …» Android Studio Как создать 7 "планшет (1280 * 800) Эмулятор разрешения экрана в Android?

Как использовать 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 

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

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 на нем / отправьте ему сообщения.