小编Rya*_*Hoo的帖子

为什么在clearView之后会调用ItemTouchHelper.Callback的onChildDraw

问题是我想在项目被拖动到 RecyclerView 时对其执行提升。

根据文档的说明,我应该在ItemTouchHelper.Callback#onChildDraw 中自定义拖动视图的行为,因为它说

如果您想自定义视图对用户交互的响应方式,这是一个覆盖的好地方。

然后我应该清除ItemTouchHelper.Callback#clearView 中的自定义,因为它说

当用户与元素的交互结束并且它也完成了它的动画时,由 ItemTouchHelper 调用。

但问题是onChildDraw总是会再调用一次clearView

所以即使我清除了 中的自定义行为clearView,它仍然会在 中被重新调用onChildDraw。那么这样做的目的是clearView什么?

这是我的代码:

class MyItemTouchCallback extends ItemTouchHelper.Callback {

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, …
Run Code Online (Sandbox Code Playgroud)

android

5
推荐指数
1
解决办法
4628
查看次数

为什么主线程的 Looper.loop() 不会阻塞 UI 线程?

今天我阅读了一些关于 Handler 和 Looper 如何协同工作的博客和源代码。

根据我所学到的,通过使用ThreadLocal魔法,我们可以在每个线程上只有一个 Looper 。通常Handler是在主线程中启动的,否则你必须手动启动或说,prepare将Looper放在一个单独的线程上,然后循环起来。

class LooperThread extends Thread {
    public Handler mHandler;

    public void run() {
        Looper.prepare();

        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                // process incoming messages here
            }
        };

        Looper.loop();
    }
}
Run Code Online (Sandbox Code Playgroud)

真正让我困惑的是loop()主线程。当我在 Looper 的源代码中读到这个时。处理消息队列然后分派消息以供回调处理是一个无限循环。

根据这个/sf/answers/363578701/,Handler 和它的 Looper 在同一个线程中运行。

如果主线程出现死循环,岂不是阻塞了整个UI系统?

我知道我一定是傻到错过了什么。但如果有人能透露这背后的秘密,那就太好了。

public static void loop() {
    final Looper me = myLooper();
    if (me == null) {
        throw new RuntimeException("No Looper; Looper.prepare() wasn't called …
Run Code Online (Sandbox Code Playgroud)

multithreading android handler looper android-looper

3
推荐指数
1
解决办法
4449
查看次数