Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OnPrimaryClipChangedListener多次调用_Android_Clipboardmanager - Fatal编程技术网

Android OnPrimaryClipChangedListener多次调用

Android OnPrimaryClipChangedListener多次调用,android,clipboardmanager,Android,Clipboardmanager,在安卓系统中,当我从Chrome、Gmail和收件箱复制文本时,我的onPrimaryClipChangedlistener方法会被调用3次,而当我在另一个应用程序(如WhatsApp)中复制一些文本或保留该方法时,正如预期的那样,只会调用一次 示例:在Chrome中复制某些文本将导致以下输出: 结果:null 结果:文本 结果:文本 奇怪的是,当从链接或页面URL复制一些文本时,该方法只被调用一次!因此,只有当我从网站的“正文”复制文本时,才会发生这种情况 有没有一个优雅的“官方”方法来解决这

在安卓系统中,当我从Chrome、Gmail和收件箱复制文本时,我的onPrimaryClipChangedlistener方法会被调用3次,而当我在另一个应用程序(如WhatsApp)中复制一些文本或保留该方法时,正如预期的那样,只会调用一次

示例:在Chrome中复制某些文本将导致以下输出:

结果:null

结果:文本

结果:文本

奇怪的是,当从链接或页面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;
    }
}

根据@septemberboy7的评论建议


我做了一些工作。移除主剪辑侦听器,并在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.5s内再次触发回调。虽然不理想,但目前仍然有效。

您找到答案了吗?我有这个问题too@septemberboy7简短回答:没有。我做了一些工作。删除主剪辑侦听器,并在500毫秒后使用处理程序重新添加。请在此处更新您的答案