0

我正在进行 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

 }

 }
4

1 回答 1

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 响应非常差

于 2014-05-06T10:55:43.057 回答