【问题标题】:UI Hang while replacing fragment from setOnInfoWindowClickListener interface method of Google Map从 Google Map 的 setOnInfoWindowClickListener 接口方法替换片段时 UI 挂起
【发布时间】:2014-05-24 00:55:26
【问题描述】:

我在我的应用程序中使用谷歌地图并显示标记。

现在点击标记窗口我想用其他片段替换当前片段。

for (StoreData store : comp.getArrStoreList()) {
                LatLng l = new LatLng(Double.parseDouble(store.getLat()),
                        Double.parseDouble(store.getLng()));

                MarkerOptions marker = new MarkerOptions()
                        .position(l)
                        .title(store.getName())
                        .snippet(store.getCity())
                        .icon(BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_AZURE));

                Marker mrkr = mapCompanyList.addMarker(marker);

                CompanyStoreData companyStoreData = new CompanyStoreData();

                companyStoreData.setStoreData(store);

                companyStoreData.setCompanyId(comp.getId());

                listStoreData.put(mrkr, companyStoreData);


                mapCompanyList
                .setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

                    @Override
                    public void onInfoWindowClick(Marker marker) {

                        try {

                            StoreDetailsFragment storeDetails = new StoreDetailsFragment();
                            Bundle b = new Bundle();

                            b.putSerializable(UserDefaults.STORE_OBJECT,
                                    listStoreData.get(marker).getStoreData());
                            b.putString("StoreAppID", listStoreData.get(marker).getCompanyId());

                            storeDetails.setArguments(b);

                            ((BaseTabbarContainer) companyListFragment.getParentFragment()).replaceFragment(
                                    storeDetails, true); // here my UI is hang

                        } catch (Exception e) {
                            Log.e("Exception", "Exception :: " + e.getMessage());
                        }

                    }
                });
            }

我正在创建一个哈希图,其中 <marker,storedata> 标记作为键,storedata(我的自定义类对象)作为值。

在 onInfoWindowClick 上,我正在根据 hashmap() 的键获取存储数据的实例。它运行良好,但是

((BaseTabbarContainer) companyListFragment.getParentFragment()).replaceFragment(
                                        storeDetails, true);  

我的 UI 在这里挂起。有什么问题

【问题讨论】:

    标签: android android-fragments google-maps-markers google-maps-android-api-2


    【解决方案1】:

    我解决了这个问题。如果有人遇到这个问题,请参考这个。

    我所做的是创建一个处理程序以在延迟一段时间后运行代码 sn-p 并在调用处理程序后从onInfoWindowClick 方法返回

    mapCompanyList
                    .setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
    
                        @Override
                        public void onInfoWindowClick(Marker marker) {
    
                            final Marker mark = marker;
                            try {
    
                                new Handler().postDelayed(new Runnable() {
    
                                    @Override
                                    public void run() {
                                        callStore(mark);
                                    }
                                }, 100);
    
    
                                return;
                            } catch (Exception e) {
                                Log.e("Exception", "Exception :: " + e.getMessage());
                            }
    
                        }
                    });
    

    callStore

        private void callStore(Marker marker) {
            StoreDetailsFragment storeDetails = new StoreDetailsFragment();
            Bundle b = new Bundle();
    
            b.putSerializable(UserDefaults.STORE_OBJECT,
                    listStoreData.get(marker).getStoreData());
            b.putString("StoreAppID", listStoreData.get(marker).getCompanyId());
    
            storeDetails.setArguments(b);
    
            ((BaseTabbarContainer) CompanyListFragment.this.getParentFragment()).replaceFragment(
                    storeDetails, true);
    
        }
    

    它奏效了;

    但我仍然不明白为什么它会挂起,以及为什么在延迟运行代码时从 onInfoWindowClick 方法返回后解决了?如果有人有任何想法,请分享。

    【讨论】:

    • 我实际上也有同样的问题,并且还可以使用计时器。但我认为这不是一个好的解决方法,因为它不能保证这有效。很不幸。我也想听听其他人是否知道为什么会发生这种情况。
    • 我知道这不是一个好的修复方法,尽管它正在工作。这就是为什么我还提到在我的回答中分享任何解决此问题的好方法。
    【解决方案2】:

    我也面临这个问题,对我来说,我通过停止使用fragmentManager.executePendingTransactions() 解决了,如果我使用这条线替换片段,那么它只是 HANG,但没有这条线它的工作没有任何问题。希望它对面临类似问题的人有所帮助。谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多