5

だから私は自分の Android アプリを Kindle に移植しており、互換性のためにいくつかの調整を期待していましたが、これはばかげています。

最初にわかったのは、onCreate() から AsyncTask を実行すると、onCreate() からもレイアウトを初期化している場合に問題が発生する可能性があることです。これは通常の Android では絶対に当てはまりませんが、Kindle で得た最終結果は、レイアウトの一部がまったく表示されないことでした。AsyncTask を onStart に移動すると問題は解決しましたが、これは少し意外でした。ただし、この AsyncTask に関する問題はまだあります。

この AsyncTask の目的は、オンラインからデータをロードし、結果をアクティビティのレイアウトに表示することです。少なくとも通常の Android デバイスでは、非常に簡単です。doInBackground でデータをロードし、onPostExecute でデータを UI に適用してページを構築します。

ただし、場合によっては (すべてではありません)、AsyncTask からのデータが画面に表示されないようです。たとえば、一部のデータは GridView に表示されます。GridView アダプターを更新し、アダプターの notifyDataSetChanged() メソッドを使用すると、アダプターからのデータを表示するようにビューが変更されます。通常の Android デバイスでのこのプロセスは正常に機能します。

ただし、この Kindle ではデータが読み込まれません (すべてではなく場合によっては、これがさらにイライラさせられます)。Kindle の [戻る] ボタンを押してから指を離すと (finish() が呼び出されないため)、データが表示されることがあります。Kindle のバージョンの Android では、notifyDataSetChanged() の通常の動作が変更されているように感じますが、アダプターにロードされたデータを表示するために他に何をすべきかわかりません。

誰かがこの問題に遭遇しましたか?

また、たまにしか発生しない場合、実際のデータ構造は一定のままですが、特定のページでは機能し、他のページでは機能しないことに注意してください(アプリは音楽に関連しているため、たとえば、あるアーティストのページが適切に読み込まれ、別のアーティストのページが正しく読み込まれますではない)。

問題の 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 に答える