2016-08-22 61 views
0

取出位置我的代碼中遇到錯誤:錯誤與書籤

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) 

此錯誤是在這個片段代碼

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; 
    } 

happend這就是爲什麼我得到它。當我添加名爲onAIR(當前在線播放)的LiveProgram時,它確定。我可以去書籤部分,但是當程序結束時,必須從書籤中刪除,但是我得到了這樣的錯誤。

我得到錯誤的:

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

當你迭代它時你不能修改'Collection' – Jens

+0

你能說更多嗎? – Genehme

+0

書籤和temp_Bookmarks是同一個對象。 – Jens

回答

1

由於bookmarkstemp_bookmarks是同一個對象的兩個引用,當您從temp_bookmarks刪除項目,也從bookmarks刪除它們,而迭代這裏面是不允許的採集。嘗試迭代之前,從bookmarks創建一個新的集合:

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

這種方式,這樣你遍歷temp_bookmarks,原來Set將保持不變,這是很好的。

邊注:建議在Java變量工作時使用camelCase命名規則,所以我建議你將名稱改爲temp_bookmarkstempBookmarks,並在你的代碼中的其他變量和方法來做到這一點。

+0

測試,但我認爲這將工作。它的意義答案。 – Genehme

+0

是的,工作。非常感謝。我有一個自由的日子:) – Genehme