Comment utiliser runOnUiThread dans Android?

Je suis nouveau pour Android et j'essaie d'utiliser le UI-Thread, donc j'ai écrit une simple activité de test. Mais je pense que j'ai mal compris quelque chose, parce qu'en cliquant sur le bouton - l'application ne répond plus""

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();
                    }
                }
             }
        }));
    }
}
122
demandé sur Jon 2012-06-21 18:21:49

9 réponses

ci-dessous est un extrait corrigé de la fonction 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();
}
175
répondu Vipul Shah 2012-06-21 14:29:38

enveloppez-le simplement comme une fonction, puis appelez cette fonction à partir de votre fil d'arrière-plan.

public void debugMsg(String msg) {
    final String str = msg;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mInfo.setText(str);
        }
    });
}
67
répondu 2015-01-16 20:56:04

vous l'avez de face à face. Votre clic sur le bouton se traduit par un appel à runOnUiThread() , mais ce n'est pas nécessaire, puisque le gestionnaire de clic est déjà en cours d'exécution sur le thread de L'interface utilisateur. Ensuite, votre code dans runOnUiThread() lance un nouveau fil d'arrière-plan, où vous essayez de faire des opérations D'UI, qui échouent alors.

au lieu de cela, il suffit de lancer le thread de fond directement à partir de votre gestionnaire de clic. Ensuite, enveloppez-les appels à btn.setText() à l'intérieur d'un appel à runOnUiThread() .

23
répondu Graham Borland 2012-06-21 14:24:31
runOnUiThread(new Runnable() {
                public void run() {
                //Do something on UiThread
            }
        });
10
répondu Terranology 2015-11-04 20:15:55

il y a plusieurs techniques d'utilisation de runOnUiThread (), voyons tout

C'est mon fil principal (fil UI) appelé AndroidBasicThreadActivity et je vais le mettre à jour à partir d'un fil d'ouvrier de différentes façons -

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.) En passant l'instance de L'activité comme argument sur le fil worker

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
    public void run()
    {

        //perform heavy task here and finally update the UI with result this way - 
        activity.runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
            }
        });
    }
}

2.) En utilisant le post de View(Runnable méthode runnable) dans le filetage du travailleur

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
    public void run()
    {
     //perform heavy task here and finally update the UI with result this way - 
       AndroidBasicThreadActivity.textView.post(new Runnable()
      { 
        @Override
        public void run()
        {
            AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
        }
    });

    }
}

3.) En utilisant la classe Handler d'android.paquet os Si nous n'avons pas le contexte (this/ getApplicationContext()) ou l'instance de L'activité (AndroidBasicThreadActivity.ceci) alors nous devons utiliser la classe Handler comme ci-dessous -

class MyAndroidThread implements Runnable
{
    Activity activity;
    public MyAndroidThread(Activity activity)
    {
        this.activity = activity;
    }
    @Override
   public void run()
  {
  //perform heavy task here and finally update the UI with result this way - 
  new Handler(Looper.getMainLooper()).post(new Runnable() {
        public void run() {
            AndroidBasicThreadActivity.textView.setText("Hello!! Android Team :-) From child thread.");
        }
    });
  }
}
5
répondu Bajrang Hudda 2018-03-05 11:24:43

vous pouvez utiliser à partir de cet échantillon:

Dans l'exemple suivant, nous allons utiliser cette facilité de publier le résultat d'une recherche synonymique qui a été traitée par un fil d'arrière-plan.

pour accomplir le but pendant le rappel D'activité OnCreate, nous allons mettre en place onClickListener pour exécuter searchTask sur un fil créé.

Lorsque l'utilisateur clique sur le bouton de Recherche, nous allons créer un Exécutable anonyme classe recherche le mot tapé dans R. id.wordEt EditText et commence le thread pour exécuter Runnable.

lorsque la recherche sera terminée, nous créerons une instance de Setsynonymresult exécutable pour publier le résultat sur le synonyme TextView sur le thread de L'interface utilisateur.

cette technique est parfois pas la plus commode, surtout quand nous ne avoir accès à une instance d'Activité; par conséquent, dans les chapitres suivants, nous sommes allons discuter plus simple et des techniques plus propres pour mettre à jour L'interface utilisateur à partir d'un arrière-plan le calcul de la tâche.

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";
    }
}

Source :

asynchrone android programming Helder Vasconcelos

0
répondu 2016-10-27 06:46:24

C'est comme ça que je l'utilise:

runOnUiThread(new Runnable() {
                @Override
                public void run() {
                //Do something on UiThread
            }
        });
0
répondu Josh Aquino 2016-12-26 01:22:09

ton:

@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");


            }
        });
    }
0
répondu MrG 2017-03-10 02:42:03
  @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();

    }
0
répondu Keshav Gera 2017-09-02 08:03:20