Как использовать runOnUiThread

Я научился что-то делать в UI-Thread, поэтому я написал простую тестовую активность. Но я думаю, что я что-то не понял, потому что когда я нажимаю кнопку - приложение больше не переписывается

public class TestActivity extends Activity {

 Button btn;
 int i = 0;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     btn = (Button)findViewById(R.id.btn);
     btn.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             runThread();
         }
     });
 }

 private void runThread(){
     runOnUiThread (new Thread(new Runnable() { 
         public void run() {
             while(i++ < 1000){
                 btn.setText("#"+i);
                 try {
                     Thread.sleep(300);
                 } 
                 catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         }
     }));
}
}

Ответы

Ответ 1

Ниже исправлен фрагмент функции runThread.

private void runThread() {

    new Thread() {
        public void run() {
            while (i++ < 1000) {
                try {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            btn.setText("#" + i);
                        }
                    });
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

Ответ 2

Просто оберните его как функцию, затем вызовите эту функцию из фонового потока.

public void debugMsg(String msg) {
    final String str = msg;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mInfo.setText(str);
        }
    });
}

Ответ 3

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

Вместо этого просто запустите фоновый поток непосредственно из обработчика кликов. Затем заверните вызовы на btn.setText() внутри вызова runOnUiThread().

Ответ 4

runOnUiThread(new Runnable() {
                public void run() {
                //Do something on UiThread
            }
        });

Ответ 5

Существует несколько методов использования runOnUiThread(), позволяет видеть все

Это мой основной поток (поток пользовательского интерфейса), называемый AndroidBasicThreadActivity, и я собираюсь обновить его из рабочего потока различными способами -

public class AndroidBasicThreadActivity extends AppCompatActivity
{
    public static TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_basic_thread);

        textView = (TextView) findViewById(R.id.textview);

        MyAndroidThread myTask = new MyAndroidThread(AndroidBasicThreadActivity.this);
        Thread t1 = new Thread(myTask, "Bajrang");
        t1.start();
    }
}

1.) Передав экземпляр Activity в качестве аргумента в рабочий поток

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
    public void run()
    {
        activity.runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
            }
        });
    }
}

2.) Используя метод View post (Runnable runnable) в рабочем потоке

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
    public void run()
    {
       AndroidBasicThreadActivity.textView.post(new Runnable()
      { 
        @Override
        public void run()
        {
            AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
        }
    });

    }
}

3.) Используя класс Handler из пакета android.os Если у нас нет контекста (this/getApplicationContext()) или экземпляра Activity (AndroidBasicThreadActivity.this), тогда мы должны использовать класс Handler, как показано ниже -

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
   public void run()
  {
  new Handler(Looper.getMainLooper()).post(new Runnable() {
        public void run() {
            AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
        }
    });
  }
}

Ответ 6

Вы можете использовать этот образец:

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

Чтобы выполнить задачу во время обратного вызова активности OnCreate, мы настроим onClickListener для запуска searchTask в созданном потоке.

Когда пользователь нажимает кнопку "Поиск", мы создадим анонимный "Runnable" класс, который ищет слово, набранное в R.id.wordEt EditText, и запускает для выполнения Runnable.

Когда поиск завершен, мы создадим экземпляр Runnable SetSynonymResult опубликовать результат на синониме TextView над потоком пользовательского интерфейса.

Этот метод когда-то не самый удобный, особенно если мы не иметь доступ к экземпляру Activity; поэтому в следующих главах мы собирается обсудить более простые и более чистые методы для обновления пользовательского интерфейса с фона вычислительная задача.

public class MainActivity extends AppCompatActivity {

    class SetSynonymResult implements Runnable {
        String synonym;

        SetSynonymResult(String synonym) {
            this.synonym = synonym;
        }

        public void run() {
            Log.d("AsyncAndroid", String.format("Sending synonym result %s on %d",
                    synonym, Thread.currentThread().getId()) + " !");
            TextView tv = (TextView) findViewById(R.id.synonymTv);
            tv.setText(this.synonym);
        }
    }

    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button search = (Button) findViewById(R.id.searchBut);
        final EditText word = (EditText) findViewById(R.id.wordEt);
        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Runnable searchTask = new Runnable() {
                    @Override
                    public void run() {
                        String result = searchSynomim(word.getText().toString());
                        Log.d("AsyncAndroid", String.format("Searching for synonym for %s on %s",
                                word.getText(), Thread.currentThread().getName()));
                        runOnUiThread(new SetSynonymResult(result));
                    }
                };
                Thread thread = new Thread(searchTask);
                thread.start();
            }
        });

    }

    static int i = 0;

    String searchSynomim(String word) {
        return ++i % 2 == 0 ? "fake" : "mock";
    }
}

Источник:

асинхронное программирование для Android Helper Vasconcelos

Ответ 7

Вот как я его использую:

runOnUiThread(new Runnable() {
                @Override
                public void run() {
                //Do something on UiThread
            }
        });

Ответ 8

ваше это:

@UiThread
    public void logMsg(final String msg) {
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Log.d("UI thread", "I am the UI thread");


            }
        });
    }

Ответ 9

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        gifImageView = (GifImageView) findViewById(R.id.GifImageView);
        gifImageView.setGifImageResource(R.drawable.success1);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //dummy delay for 2 second
                    Thread.sleep(8000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //update ui on UI thread
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        gifImageView.setGifImageResource(R.drawable.success);
                    }
                });

            }
        }).start();

    }