在我的应用程序中,我注意到如果片段不断卸载并且不得不再次从网络获取信息,用户将使用大量数据。我的应用程序中有三个操作栏选项卡,当您转到中间(第二个)选项卡时,第一个片段不会卸载,但是当您转到第三个片段并返回第一个片段时,第一个片段已卸载,因此应用程序重做 AsyncTask 使其再次下载信息。
最好我想更改我的代码,以便应用程序从内部存储中的文件加载信息,该文件已在先前日期下载,因此用户可以在 Pulltorefresh 或其他东西需要时更新此信息。我不确定如何将我的代码变成这种方式,我非常怀疑你们中的任何人都愿意花时间为我做这件事,从而引出我的下一个问题。
您可以保存片段的状态以使应用程序将状态保存到第三个选项卡而不是第二个选项卡。我将永远只有三个选项卡,因此只需将其设置为该数量,并且我查看了一些文档,但尚未找到适合我的答案。以下是我的一些应用程序文件,可能对您有用。
List.class(不断卸载的片段)
public class List extends Fragment {
// All static variables
static final String URL = "http://aspecficwebsite.com/appinfo.xml";
// XML node keys
static final String KEY_GAME = "game"; // parent node
static final String KEY_ID = "id";
static final String KEY_TITLE = "title";
static final String KEY_DATES = "dates";
static final String KEY_PLATFORMS = "platforms";
static final String KEY_THUMB_URL = "thumb_url";
ListView list;
ArrayList<HashMap<String, String>> songsList;
View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new TheTask().execute();
/*
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
}
}); */
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
view = inflater.inflate(R.layout.main, container, false);
//list = (ListView) view.findViewById(R.id.game_list);
return view;
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
class TheTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
songsList = new ArrayList<HashMap<String, String>>();
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_GAME);
// looping through all song nodes <song>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
map.put(KEY_DATES, parser.getValue(e, KEY_DATES));
map.put(KEY_PLATFORMS, parser.getValue(e, KEY_PLATFORMS));
map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
// adding HashList to ArrayList
songsList.add(map);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Getting adapter by passing xml data ArrayList
LazyAdapter adapter = new LazyAdapter(getActivity(), songsList);
view = getView();
ListView mlist = (ListView) view.findViewById(R.id.game_list);
mlist.setAdapter(adapter);
super.onPostExecute(result);
}
}
}