简体   繁体   English

从书签中删除位置时出错

[英]Error with remove position from bookmarks

i got error in my code: 我的代码有错误:

java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:787)
    at java.util.HashMap$KeyIterator.next(HashMap.java:814)
    at openprojects.atvt.ui.VideoAdapter.getLiveTvBookmarks(VideoAdapter.java:107)
    at openprojects.atvt.ui.MainActivity.switchRowsFragment(MainActivity.java:323)
    at openprojects.atvt.ui.MainActivity.setPosition(MainActivity.java:378)
    at openprojects.atvt.ui.MainActivity.access$500(MainActivity.java:48)
    at openprojects.atvt.ui.MainActivity$4.onRequestChildFocus(MainActivity.java:268)
    at android.support.v17.leanback.widget.BrowseFrameLayout.requestChildFocus(BrowseFrameLayout.java:124)
    at android.view.ViewGroup.requestChildFocus(ViewGroup.java:740)
    at android.view.ViewGroup.requestChildFocus(ViewGroup.java:740)
    at android.view.ViewGroup.requestChildFocus(ViewGroup.java:740)
    at android.support.v7.widget.RecyclerView.requestChildFocus(RecyclerView.java:2106)
    at android.view.ViewGroup.requestChildFocus(ViewGroup.java:740)
    at android.view.View.handleFocusGainInternal(View.java:5471)
    at android.view.View.requestFocusNoSearch(View.java:8476)
    at android.view.View.requestFocus(View.java:8455)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4203)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4089)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3820)
    at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3981)
    at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2253)
    at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1874)
    at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1865)
    at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2230)
    at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:323)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

This error is happend in this fragment code 此片段代码中发生此错误

public List<LiveTvProgram> getLiveTvBookmarks() {
        String name = context.getString(R.string.preferences_bookmarks_live_tv);
        Set<String> bookmarks = preferenceHelper.getStringSet(name, name);
        Set<String> temp_bookmarks = bookmarks;
        ArrayList<LiveTvProgram> bookmarkList = new ArrayList<>();
        for (String title : bookmarks) {
            for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
                if (program.getTitle().equals(title)) {
                    if (program.hasEnded()) {
                        temp_bookmarks.remove(title);
                    } else {
                        bookmarkList.add(program);
                    }
                    break;
                }
            }
        }
        if (temp_bookmarks.size() != bookmarks.size()) {
            preferenceHelper.putStringSet(name, name, temp_bookmarks);
        }
        return bookmarkList;
    }

And this is why i got it. 这就是为什么我明白了的原因。 When i add LiveProgram called onAIR(currently online played) its ok. 当我添加称为onAIR(当前在线播放)的LiveProgram时,就可以了。 I can go to bookmarks section, but when program is end, then must been deleted from bookmarks, but i got error like this. 我可以转到书签部分,但是当程序结束时,必须将其从书签中删除,但是出现了这样的错误。

i got error from: 我收到以下错误消息:

if (program.hasEnded()) {
    temp_bookmarks.remove(title);
} else {
    bookmarkList.add(program);
}

Since bookmarks and temp_bookmarks are two references of the same object, when you remove items from temp_bookmarks , you also remove them from bookmarks , which is not allowed while iterating over this collection. 由于bookmarkstemp_bookmarks是同一对象的两个引用,因此当您从temp_bookmarks删除项目时,也会从bookmarks删除它们,因此在迭代此集合时是不允许的。 Try creating a new collection from bookmarks before iterating: 尝试在迭代之前根据bookmarks创建一个新集合:

Set<String> temp_bookmarks = new HashSet<>(bookmarks);

This way, way you iterate over temp_bookmarks , the original Set will be left unchanged, which is nice. 这样,您可以遍历temp_bookmarks ,原始Set将保持不变,这很好。

Side note: it is recommended to use camelCase naming convention when working with variables in Java, so I recommend you to change the name temp_bookmarks to tempBookmarks , and to do so with other variables and methods in your code. 旁注:在Java中使用变量时,建议使用camelCase命名约定,因此建议您将名称temp_bookmarks更改为tempBookmarks ,并在代码中使用其他变量和方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM