5

所以我将我的 Android 应用程序移植到 Kindle 上,并期待对兼容性进行一些调整,但这变得荒谬了。

我发现的第一件事是,如果您也从 onCreate() 初始化布局,显然从 onCreate() 运行 AsyncTask 可能会导致一些问题。在常规 Android 中绝对不是这种情况,但我在 Kindle 上得到的最终结果是我的部分布局根本没有显示。将 AsyncTask 移动到 onStart 解决了这个问题,但这有点令人惊讶。不过,我仍然有涉及此 AsyncTask 的问题。

此 AsyncTask 的目的是从在线加载数据并在活动的布局中显示结果。非常简单,至少在普通的 Android 设备上是这样。只需在 doInBackground 中加载数据,然后在 onPostExecute 中将数据应用到 UI 以构建页面。

但是,似乎在某些情况下(不是全部)来自 AsyncTask 的数据不会显示在屏幕上。例如,一些数据显示在 GridView 中。我更新了 GridView 适配器,使用了适配器的 notifyDataSetChanged() 方法,应该发生的是视图被更改为显示来自适配器的数据。此过程在普通 Android 设备上运行良好。

然而,在这台 Kindle 上,数据并没有加载(同样在某些情况下,不是全部,这使得这更加令人沮丧)。我发现如果你按下 Kindle 上的返回按钮,然后将你的手指从它上面拖开(所以没有调用 finish()),数据有时会显示出来!我感觉 notifyDataSetChanged() 的正常行为已针对 Kindle 的 Android 版本进行了更改,但我不确定我还需要做什么来显示加载到适配器中的数据。

有没有人遇到过这个问题?

另外,我应该注意,在它只是有时发生的情况下,实际的数据结构保持不变,但对于某些页面它可以工作,而其他页面则不能(该应用程序与音乐有关,因此例如一个艺术家的页面正确加载而另一个才不是)。

我已经包含了有问题的 AsyncTask,它可以在任何 Android 设备上完美运行,所以我不知道它会有什么用途,但无论如何它都在这里:

private class GetAttendees extends AsyncTask<Void, Void, AttendeesSectionData> {

    @Override
    protected AttendeesSectionData doInBackground(Void... params) {
        JsonHandler jsonHandler = new JsonHandler(getApplicationContext());
        return jsonHandler.getEventAttendeesFromFb(mEvent.getFacebookEventId(), JsonHandler.FACEBOOK_FRIENDS_NO_LIKES);
    }

    @Override
    protected void onPostExecute(AttendeesSectionData data) {
        if(data != null && !data.isEmpty()) {

            if(data.size() > 18) {
                ArrayList<String> toShow = new ArrayList<String>();

                int friendLimit = data.getFriendsAttendingIds().size();
                if(friendLimit > 18)
                    friendLimit = 18;

                for(int i = 0; i < friendLimit; i++)
                    toShow.add(data.getFriendsAttendingIds().get(i).getImageURL());

                int toShowSizeAfterFriends = toShow.size();

                if(toShowSizeAfterFriends < 18) {
                    int othersLimit = data.getNonFriendsAttendingIds().size();
                    if(othersLimit > 18 - toShowSizeAfterFriends)
                        othersLimit = 18 - toShowSizeAfterFriends;

                    for (int i = 0; i < othersLimit; i++)
                        toShow.add(data.getNonFriendsAttendingIds().get(i).getImageURL());

                }

                mFbImagesAdapter.setItems(toShow);
            }
            else
                mFbImagesAdapter.setItems(data.unloadIntoOneArrayList());

            String caption = String.format(AppSettings.ATTENDEE_HEADER_CAPTION, 
                    //fill in the %s with:
                    data.getFriendsAttendingIds().size(), 
                    data.getNonFriendsAttendingIds().size());

            caption = caption.replace("*", "<b>");
            caption = caption.replace("?", "</b>");

            mAttendeesCaption.setText(Html.fromHtml(caption));

            calculateGridSize(data.size());
        }
        else {
            Print.log("no attendees for event " + mEvent.getVenue_FormattedLocation());
            mAttendeesGrid.setVisibility(View.GONE);
            mAttendeesHeaderContainer.setVisibility(View.GONE);
        }

        loadFacebookImages();
    }
}

谢谢!

4

1 回答 1

3

我找到了解决方案。哦,伙计,花了很长时间,但我终于明白了。

这真的很愚蠢。基本上,xml 属性android:animateLayoutChanges会完全破坏您的布局。我猜 Kindle 会尝试动画,但失败了,所以最终结果是什么都没有发生。android:animateLayoutChanges从我的应用程序中删除所有实例解决了这个问题。

我希望将来遇到此问题的其他人可以通过偶然发现此答案来节省大量时间。

于 2013-09-19T22:15:23.430 回答