使用runonuthread时出现白屏



我正在进行onTouchListener的实验。目的是将framayout移动到我触摸的任何地方。第一个版本的代码给了我一个"viewwroot $ callledfromwrongthreadexception"错误。所以在第二个版本中,我尝试使用runonuthread来解决错误。但是这样做,只会给出一个白屏幕。

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

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

但是仍然存在问题,因为您不断向UI线程发布新的Runnables,这可能会导致非常糟糕的UI响应

最新更新