Итак, я переношу свое приложение для Android на Kindle и ожидал некоторых изменений для совместимости, но это становится нелепым.
Первое, что я обнаружил, это то, что запуск AsyncTask из onCreate() может вызвать некоторые проблемы, если вы также инициализируете свой макет из onCreate(). Это определенно не так в обычном Android, но конечный результат, который я получил на Kindle, заключался в том, что части моего макета вообще не отображались. Перемещение AsyncTask в onStart решило проблему, но это немного удивило. У меня все еще есть проблема с этой AsyncTask.
Целью этой AsyncTask является загрузка данных из Интернета и отображение результата в макете действия. Довольно просто, по крайней мере, на обычных устройствах Android. Просто загрузите данные в doInBackground, а затем в onPostExecute примените данные к пользовательскому интерфейсу для создания страницы.
Однако кажется, что в некоторых случаях (не во всех) данные из AsyncTask не будут отображаться на экране. например, некоторые данные отображаются в GridView. Я обновляю адаптер GridView, использую метод адаптера notifyDataSetChanged(), и должно произойти изменение представления для отображения данных из адаптера. Этот процесс на обычном устройстве Android работает нормально.
Однако на этом Kindle данные не загружаются (опять же, в некоторых случаях не все, что еще больше расстраивает). Я обнаружил, что если вы нажмете кнопку «Назад» на Kindle, а затем уберете с нее палец (поэтому не вызывается функция finish()), данные иногда будут отображаться! Я чувствую, что нормальное поведение notifyDataSetChanged() было изменено для версии Android Kindle, но я не уверен, что еще я должен сделать, чтобы показать данные, загруженные в адаптер.
Кто-нибудь сталкивался с этой проблемой?
Кроме того, я должен отметить, что в случае, если это происходит только иногда, фактическая структура данных остается постоянной, но для определенных страниц она работает, а для других нет (приложение относится к музыке, поэтому, например, страница одного исполнителя загружается правильно, а страница другого не).
Я включил рассматриваемую 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();
}
}
Спасибо!