0

我正在做一個onTouchListener的實驗。我們的目標是將FrameLayout移到任何我碰到的地方。 代碼的第一個版本給了我一個「viewroot $ calledfromwrongthreadexception」錯誤。 因此在第二個版本中,我嘗試使用runOnUiThread來解決錯誤。但是,這樣做只會給白屏。使用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 

} 

} 

回答

2

的onCreate方法運行在主(UI)線程和你發佈一個Runnable到主(UI)線程上運行。

在該線程你有

while (p_running) 

所以這個while循環在UI線程在一個無限循環運行的循環。

你可以的代碼只需移動到另一個線程像這樣

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(); 

但仍有與問題,你都在不斷髮布新的Runnable到UI線程這可能會導致非常差的UI響應

+0

謝謝。你的代碼作品。 – Wallyfull