2

我目前正在开发一个应用程序(您可能已经回答或看到了我的其他一些问题)并且遇到了可用性问题。我有一个导航抽屉,当用户单击其中一个项目时,另一个片段会替换主 frame_content。我遇到的问题是,交易在我的设备上需要一些时间。

我单击导航抽屉中的一项,然后该应用程序“卡住”了几秒钟,并将继续正常工作。

我也知道问题出在哪里,因为当我替换其中没有数据的片段时,它会立即工作。只是,该应用程序必须显示非常多的数据。我将 a 传递HashMap<String, Collection<String>>给片段并在那里阅读它。我将它保存到一个数组中,然后在 for 循环中再次读取该数组并显示数据。

我考虑了其他各种方法,例如:在主要活动中读取所有数据,然后将多个数组传递给片段。但问题是,每个片段我需要 13 个数组,因为 hashmap 包含 13 个不同键的数据。每个键有 1 个值。总共有50个条目。所以

50 个条目包含 13 个键,包含 1 个值。

这是要为设备加载的大量数据。所以我想到了如何提高加载片段的速度。

我在加载初始屏幕时使用 AsyncTask 从 XML 下载数据,然后将其保存到不同的哈希图中(取决于我加载的 xml)。然后我对主要活动开始一个新的意图并传递所有哈希映射。然后根据导航抽屉列表打开一个新片段,并将哈希图传递给片段中的函数。然后将数据读入数组,并在 OnCreateView 方法中再次读取数组以将数据添加到布局中。

任何速度改进的想法?这就是我目前更改片段的方式

protected void onNavItemSelected(int id) {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
    switch ((int) id) {
    case 101:
        MainFragment.passList(hashMap);
        ft.replace(R.id.content_frame, new MainFragment());
        ft.commit();
        break;
//further cases....
4

1 回答 1

3

也许

ft.commit();
getSupportFragmentManager().executePendingTransactions();
break;

将帮助您更快地执行事务(确保在主线程上调用它)

http://developer.android.com/reference/android/app/FragmentManager.html#executePendingTransactions()

或者如果问题不在事务本身,也许是你的循环需要改进?

于 2013-10-11T12:51:36.590 回答