Android:处理来自非UI线程的onTouch事件

时间:2017-03-14 16:33:16

标签: android android-asynctask motionevent

我不确定我尝试做的事情是否有任何意义,但我会试一试: 我的手机充当客户端,我需要将有关运动事件的数据发送到服务器。 我正在处理与AsyncTask的通信,所以我想在我的AsyncTask类中实现onTouch方法。 我让我的AsyncTask实现了View.OnTouchListener,但事件并没有真正进入我的AsyncTask中的onTouch方法。 我猜我错过了一些非常基本的东西......

这是AsyncTask代码:

.tooltip {
display: inline-block;
position: fixed;
padding: .5em 1em;
background-color: #f1f1f1;
}

由于

编辑,已解决:

正如许多在此发表评论的人所说,我必须将onTouch实现附加到特定视图。 所以,因为我需要我的onTouch事件来包含所有屏幕的大小,我只是创建了一个相对布局的对象并将其传递给我的asyncTask(实现OnTouchListener)的构造函数,并在我设置的构造函数<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <h4 id="log">pageX: -, pageY: -</h4> <div class="tooltip">I'm a tooltip!</div>上。 这就是诀窍 - 当我触摸屏幕时,现在会调用asyncTask中的onTouch方法。

非常感谢大家。

3 个答案:

答案 0 :(得分:1)

有一点缺乏信息。您是否正确使用

将asyncTask作为onTouchListener放在视图上
view.setOnTouchListener(yourAsyncTask);

请注意,yourAsyncTask对象必须完全是正在运行的对象(而不是新的或匿名的实例)。因此,我建议您在开始运行asyncTask时添加侦听器。

如果您已经这样做了,我建议您发布更多信息(您的活动代码,asyncTask启动和setOnTouchListener部分)。

编辑: 代码示例:

@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和活动代码,我就无法更精确。遗憾

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

答案 2 :(得分:1)

我认为你的对象关系有点内而外。不要让AsyncTask拥有OnTouchListener,而是让OnTouchListener(在UI线程中始终调用)触发AsyncTask

如果您的AsyncTask在完成后更新了用户界面,那么您需要跟踪正在运行的AsyncTask,以便在活动暂停时取消它们。否则,你可能会AsyncTask点火而忘记。 (创建它,执行它,让它超出范围。)