2017-03-14 52 views
0

私は何をしようとしているのか分かりませんが、私はそれに行くでしょう: 私の電話はクライアントとして機能し、データを送信する必要がありますサーバーへのモーションイベントについて AsyncTaskとの通信を処理しているので、私はAsyncTaskクラスの中でonTouchメソッドを実装したいと思います。 私のAsyncTaskはView.OnTouchListenerを実装しましたが、イベントは実際には私のAsyncTask内のonTouchメソッドに到達していません。 私はここでAndroid:UI以外のスレッドからonTouchイベントを処理する

がAsyncTaskコードです..私は非常に基本的な何かが欠けていることを推測している:

public class tpAsyncTask extends AsyncTask<String,String,String> implements View.OnTouchListener { 

Context context; 
boolean isCancelled = false; 
float prevX; 
float prevY; 
Socket socket; 
ObjectOutputStream oos; 
private final static String TAG = "ME ASYNCTASK LOGGER: ";  

public tpAsyncTask(Context context){ 
    this.context = context; 
} 

@Override 
protected String doInBackground(String... strings) { 
    String IP = strings[0]; 
    String port = strings[1]; 

    try { 
     InetAddress inetAddress = InetAddress.getByName(IP); 
     socket = new Socket(inetAddress,Integer.parseInt(port)); 
     OutputStream os = socket.getOutputStream(); 
     oos = new ObjectOutputStream(os); 
     while(!isCancelled()) { 
      Thread.sleep(1000); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

@Override 
protected void onCancelled() { 
    super.onCancelled(); 
    try { 
     oos.flush(); 
     oos.close(); 
     socket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public boolean onTouch(View view, MotionEvent motionEvent) { 
// PROBLEM IS THAT THE APP NEVER REACH HERE 
     if(!isCancelled()) { 
      switch(motionEvent.getAction()) { 
       case MotionEvent.ACTION_MOVE: 
       { 
        Log.d(TAG, "ACTION MOVE IS PREFORMED"); 
       } 
       case MotionEvent.ACTION_DOWN: 
       { 
        Log.d(TAG, "ACTION DOWN IS PREFORMED"); 
       } 
      } 
     } 
     return false; 
    }} 

おかげ

を解決しEDIT:

男の多くonTouchの実装を特定のビューにアタッチする必要がありました。 そのため、画面のサイズをすべて入れるためにonTouchイベントが必要なので、単純に相対レイアウトのオブジェクトを作成し、asyncTask(OnTouchListenerを実装する)のコンストラクタに渡し、コンストラクタでmyRelativeLayout.setOnTouchListerner(this)を設定しました。 これは、画面に触れるたびにasyncTask内のトリック - オンタッチメソッドが呼び出されるようになりました。

ありがとうございます。

+0

PostExecute()のonTouchListener()を設定してください –

答えて

1

情報が少し不足しています。あなたは正しくyourAsyncTaskオブジェクトが正確に実行されている1(及びない新しいまたは匿名インスタンス)である必要が

view.setOnTouchListener(yourAsyncTask); 

お知らせを使用してonTouchListenerとしてビューであなたのasyncTaskを入れました。したがって、asyncTaskの実行を開始するときにリスナーを追加することをお勧めします。

既に行っている場合は、詳細情報(アクティビティコード、asyncTask launch、およびsetOnTouchListener部分)を投稿することをお勧めします。

EDIT: コード例:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    View viewToTouchWithReact=findViewById(R.id.yourViewId); 
    AsyncTask task=/**.AsynTask creation and launch.**/ 
    viewToTouchWithReact.setOnTouchListener(task); 
} 

そのようなことを行います。 asyncTaskを起動するコードとアクティビティコードがなければ、私はもっと正確にすることはできません。申し訳ありません

+0

これは私が紛失している部分である必要があります。しかし、私はあなたを理解しています。コードサンプルで詳しく説明できますか?リスナーをどのビューに正確に追加する必要がありますか? – Noam

+1

ユーザータッチに反応させるビューにリスナーを追加する必要があります。 – Feuby

1

AsyncTaskはユーザーが「触れる」UI要素ではないため、コードに到達できません。リスナーをビューに追加して、非同期タスクを起動する必要があります。

view.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent motionEvent) { 
     switch(motionEvent.getAction()) { 
      case MotionEvent.ACTION_MOVE: 
      { 
       tpAsyncTask<String,String,String> task = new tpAsyncTask<>(); 
       task.execute(motionEvent); 
       Log.d(TAG, "ACTION MOVE IS PREFORMED"); 
      } 
      case MotionEvent.ACTION_DOWN: 
      { 
       Log.d(TAG, "ACTION DOWN IS PREFORMED"); 
      } 
     } 
     return false; 
    } 
}); 
+0

私の理解では、あなたが提供しているのはKevin Krumwiedeが提供しているものと似ています。私の質問は - それはUIスレッドであまり働かないでしょうか?私は、各モーションイベントに対してasyncTaskを作成して実行することを意味しますか? – Noam

+0

AsyncTaskのアイデアは、別のスレッドでコードを実行することです。しかし、モーションイベントがたくさんある場合は、それらをリストで収集し、一度にすべて送信することができます。 –

1

オブジェクトの関係はやや内側にあると思います。 AsyncTaskOnTouchListenerとするか、OnTouchListener(常にUIスレッドで呼び出されます)をAsyncTaskにします。

完了後にAsyncTaskのUIが更新された場合は、AsyncTaskの実行を追跡して、アクティビティが一時停止している場合にキャンセルする必要があります。それ以外の場合は、AsyncTaskを火に捨ててもいいかもしれません。

+0

洞察をお寄せいただきありがとうございますが、UIスレッドであまり働かないでしょうか?私は毎秒数十のAsyncTasksの起動を意味しますか? 1つのasynctaskからtoucheventsを単に聞くのではなく、各asynctask/motionイベントを設定するすべてのオーバーヘッドを節約できますか? – Noam

+0

@Noam 'AsyncTask'はバックグラウンドスレッドでほとんどの作業を行います。私はあなたがそれをテストするまでオーバーヘッドが大きすぎるとは思わないでしょう。そうであれば、 'AsyncTask'を完全に使い捨てて、同時に複数のリクエストを処理できるネットワークライブラリを使用することができます。 –

+0

または、あなたは 'OnTouchListener'でタッチイベントをキューに入れ、数秒ごとにそれらを送信するタスクを起動するだけです。 –

関連する問題