使用runOnUiThread时出现白屏

时间:2014-05-06 10:51:44

标签: android ontouchlistener ui-thread background-thread setcontentview

我正在进行onTouchListener的实验。目的是将FrameLayout移动到我触摸的任何地方。 第一版代码给了我一个“viewroot $ calledfromwrongthreadexception”错误。 所以在第二个版本中,我尝试使用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

 }

 }

1 个答案:

答案 0 :(得分: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();

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