bugfix> android > 投稿

ソケットにデータを書き込むAsyncTaskがあり、リリースまでボタンを保持するonTouchイベントを実行したくありません。私は実際にAsyncTaskでそれをやったが、ソケットに書き込んだ後にアプリケーションがクラッシュする。代わりにスレッドを使用する必要がありますか、この問題に対するより良い解決策はありますか?

編集:logcatに「ブロッキングGC Allocを待っています」というメッセージが表示されます。

OnTouchListenerコード:

buttonUp.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            while(true){
                if (event.getAction() == MotionEvent.ACTION_DOWN){
                    new moveForward().execute();
                } else if (event.getAction() == MotionEvent.ACTION_UP){
                    break;
                }
            }
            return false;
        }
    });

AsyncTaskコード:

private class moveForward extends AsyncTask<Void, Void, Void>{
    @Override
    protected Void doInBackground(Void... voids) {
        try {
            MainActivity.client.write('u');
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
    }
}

回答 1 件
  • メインUIスレッドで無限ループを実行しないでください。 ACTION_DOWNでタスクを開始し、ACTION UPで終了できます。複数のタスクを無限に開始しています。このコードを試してください

       moveForward moveForward;
        buttonUp.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                    if (event.getAction() == MotionEvent.ACTION_DOWN){
                        moveForward = new moveForward();
                        moveForward.execute();
                    } else if (event.getAction() == MotionEvent.ACTION_UP){
                        moveForward.cancel(true);
                    }
                return false;
            }
        });
    
        private class moveForward extends AsyncTask<Void, Void, Void>{
        @Override
        protected Void doInBackground(Void... voids) {
            while(!isCancelled()) {
                try {
                    MainActivity.client.write('u');
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
             }
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
        }
    }
    
    

あなたの答え