所以我将我的 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();
}
}
谢谢!