OnPrimaryClipChangedListener被多次调用。

4
在Android中,当我从Chrome、Gmail和Inbox中复制文本时,我的onPrimaryClipChangedlistener方法会被调用3次,而当我在其他应用程序中如WhatsApp或Keep中复制一些文本时,这个方法就像预期的那样只被调用一次。
例如:在Chrome中复制一些文本将导致以下输出:
结果:null 结果:text 结果:text 奇怪的是,当从链接或页面的URL复制一些文本时,该方法只被调用一次!所以这只发生在我从网站的“正文”中复制文本时。
有没有一种优雅且“官方”的解决方法?我在stackoverflow上读了几篇关于这个主题的答案,但似乎没有什么能解决我的问题。
正如我所说,这个问题似乎只影响某些应用程序,这是否意味着是另一个应用程序的问题?
这是我的代码。
ClipboardManager mClipboard;
static boolean bHasClipChangedListener = false;

ClipboardManager.OnPrimaryClipChangedListener mPrimaryChangeListener = new ClipboardManager.OnPrimaryClipChangedListener() {
    public void onPrimaryClipChanged() {
        updateClipData();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
    registerPrimaryClipChanged();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterPrimaryClipChanged();
}

void updateClipData() {
    ClipData clip = mClipboard.getPrimaryClip();
    ClipData.Item item = clip.getItemAt(0);
    Log.d(LogUtils.BASIC_LOG, "result: " + item.getText());
}

private void registerPrimaryClipChanged(){
    if(!bHasClipChangedListener){
        mClipboard.addPrimaryClipChangedListener(mPrimaryChangeListener);
        bHasClipChangedListener = true;
    }
}
private void unregisterPrimaryClipChanged(){
    if(bHasClipChangedListener){
        mClipboard.removePrimaryClipChangedListener(mPrimaryChangeListener);
        bHasClipChangedListener = false;
    }
}

你找到答案了吗?我也遇到了这个问题。 - Myat Min Soe
@septemberboy7 简短回答:不。 - iroyo
我已经做了一些工作。通过使用Handler,在500毫秒后删除主要剪辑侦听器并重新添加。 - Myat Min Soe
请在此更新您的答案 - Anand Savjani
1个回答

2

继@septemberboy7的建议后,我已经做了一些工作。通过使用Handler,在500毫秒后删除主要剪辑侦听器并重新添加。

以下代码缓解了这个问题:

void startPrimaryClipChangedListenerDelayThread() {
    mClipboardManager.removePrimaryClipChangedListener(mListener);
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
           mClipboardManager.addPrimaryClipChangedListener(mListener);
        }
    }, 500);
}

在OnPrimaryClipChangedListener中的onPrimaryClipChanged()回调函数内立即调用此方法,以防止回调再次触发0.5秒。虽然不是理想的解决方案,但目前可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接