解決できないようなバグのあるアプリケーションが市場に出回っています。今日、私はそれを次の方法まで追跡しました。
public void updateDealList(ArrayList<Deal> deals) {
// first call or showing bookmakrs (also gets called other times when adapter is null)
if (dealListAdapter == null || showingBookmarks || !dealListAdapter.moreDealsToDownload()) {
dealListAdapter = new EndlessDealListAdapter(getActivity(),
R.layout.deal_list_item, deals);
setListAdapter(dealListAdapter);
listView = getListView();
if (getActivity().findViewById(R.id.right_fragment_container)!=null){ // if tablet
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT);
}
showingBookmarks=false;
Log.d("UPDATE_DEAL_LIST", "Notified list created new" + dealListAdapter.getCount());
return; //PROBLEM OCCURS WHEN APP COMES IN HERE AFTER RESUMING
}
dealListAdapter.getDealListAdapter().clear();
for (Deal d: deals){
dealListAdapter.getDealListAdapter().add(d);
Log.d("UPDATE_DEAL_LIST", "added " + d.title);
}
dealListAdapter.notifyDataSetChanged();
Log.d("UPDATE_DEAL_LIST", "Notified list " + dealListAdapter.getCount());
}
このメソッドには、インターネットからプルダウンされた取引オブジェクトの配列リストが渡されます。アプリケーションが最初に開かれると、データがインターネットからプルされ、上記のメソッドが呼び出されて、ListFragmentに設定された新しいアダプターが作成されます。このメソッドは、ユーザーがさらに取引を要求したときにも呼び出されます。
私が抱えている問題は、アダプターに取引が含まれているにもかかわらず、リストが空であると考えることがあるということです。これは、デバイスのメモリが不足しているときにアプリケーションを再開したときに発生するようです(アプリケーションの一部がRAMから削除されたと思います)。このメソッドが呼び出され、dealListAdapterがnullであるため、新しいメソッドが作成され、取引が追加されます。これが発生しても、リストは空のままであり、ユーザーはアプリを強制的に閉じて再び機能させる必要があります。
以下の行は、メソッドが呼び出されたときのtatを示しており、ifと21の取引がアダプターに追加されます。残念ながら、リストはユーザーには空です。
05-23 01:52:32.879: D/UPDATE_DEAL_LIST(3478): Notified list created new21