Android - 从非UI线程访问剪贴板

时间:2015-02-18 18:31:59

标签: android multithreading service

我有一个Android应用程序,当单击一个按钮时,它启动后台服务(在自己的进程中运行)。此服务连接到在UI中指定IP的远程计算机。

此服务启动一个创建连接的线程。如果连接成功,则启动另外两个线程(一个用于处理发送和另一个用于处理数据接收)。

后两个线程中的一个(发送一个)应该监视剪贴板的更改并获取更改的文本以进行处理。为此,我在线程的run方法中有以下代码:

        final ClipboardManager clipBoard  = (ClipboardManager)appContext.getSystemService(Context.CLIPBOARD_SERVICE);
        if(clipBoard != null) {
            clipBoard.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
                @Override
                public void onPrimaryClipChanged() {
                    if(clipBoard.hasPrimaryClip()) {
                        if(clipBoard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
                            ClipData.Item textItem = clipBoard.getPrimaryClip().getItemAt(0);
                            String text = textItem.getText().toString();

                            if(text != null) {
                                  //do something with the text
                            }
                        }
                    }
                 }
             });
        }

但是,在运行应用程序时,我收到错误: Can't create handler inside thread which has not called Looper.prepare()

我读到了关于Loopers的内容,但我不明白如何在我的案例中使用它。我该怎么做才能解决这个错误?

1 个答案:

答案 0 :(得分:0)

如果没有更多代码,很难准确说出,但问题可能是OnPrimaryClipChangedListener在其实施中使用HandlerHandler必须按照定义调用Looper.prepare()。< / p>