0

Je fais une expérience de onTouchListener. Le but est de déplacer le FrameLayout partout où je le touche. La 1ère version du code me donne une erreur "viewroot $ calledfromwrongthreadexception". Donc dans la 2ème version, j'essaie d'utiliser runOnUiThread pour résoudre l'erreur. Mais ce faisant, ne donne qu'un écran blanc.écran blanc lors de l'utilisation de runOnUiThread

public class MainActivity extends Activity implements Runnable, OnTouchListener{ 

private int x,y; 
private boolean p_running = false; 
private FrameLayout mFrame; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

    mFrame=(FrameLayout) findViewById(R.id.frameLayout1); 
    mFrame.setOnTouchListener(this); 
    p_running = true; 

    runOnUiThread(new Thread(new Runnable(){ 
      @Override 
      public void run(){ 
       while (p_running){ 
       mFrame.setPadding(x,y,0,0); 
       } 
      } 
      })); 

} 

@Override 
public boolean onTouch(View v, MotionEvent event){ 

    x = (int)event.getX(); 
    y = (int)event.getY(); 

    return true; 
} 

@Override 
public void run() { 
// TODO Auto-generated method stub 

} 

} 

Répondre

2

La méthode onCreate fonctionne sur le thread principal (UI) et votre affichant un Runnable pour exécuter sur le thread principal (UI).

Dans ce thread vous avez une boucle avec

while (p_running) 

donc cette boucle while est en cours d'exécution sur le thread d'interface utilisateur dans une boucle infinie.

Vous pouvez simplement déplacer ce code à un autre thread comme si

Thread t = new Thread(){ 

    @Override 
    public void run(){ 
     while (p_running){ 
      runOnUiThread(new Runnable(){ 

       @Override 
       public void run(){ 
        mFrame.setPadding(x,y,0,0); 
       } 

      }); 
     } 
    } 
}); 
t.start(); 

mais il y a encore des problèmes avec ce que vous envoyez des messages constamment de nouveaux runnables au thread d'interface utilisateur qui se traduira probablement en réponse très mauvaise interface

+0

Merci. Votre code fonctionne. – Wallyfull

Questions connexes