0

onTouchListener の実験を行っています。目的は、FrameLayout をどこにでも移動することです。コードの最初のバージョンでは、「viewroot$calledfromwrongthreadexception」エラーが発生します。そのため、2 番目のバージョンでは、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();

ただし、新しい Runnables を UI スレッドに常に投稿しているため、UI の応答が非常に悪くなる可能性があるため、まだ問題があります。

于 2014-05-06T10:55:43.057 に答える