我正在开发一个Android应用程序,当设备找到互联网连接时,它会访问保存在远程位置的XML文件。我想在我的应用程序中本地保存文件,这样即使设备没有数据连接,app也可以解析本地XML文件中的数据。以下是我目前正在使用的代码
private class ListAsync extends AsyncTask<Void, Void, Void> {
File path = new File(getFilesDir(),"my_data_folder");
@Override
protected void onPreExecute() {
Log.i("test", "Running on ui thread");
}
@Override
protected Void doInBackground(Void... params) {
nameAddressList = null;
final XMLDOMParserHandler parser = new XMLDOMParserHandler(
tag_name.toLowerCase(), ListOfPlacesActivity.this);
try {
CheckConnectivity checkConnectivity = new CheckConnectivity(ListOfPlacesActivity.this);
if (checkConnectivity.isConnectivityOn()) {
URL myURL = new URL("http://somewebsite.com/data.xml");
URLConnection ucon = myURL.openConnection();
final InputStream is = ucon.getInputStream();
try {
if( !path.isDirectory()) {
path.mkdir();
}
File dataFile = new File(path,"data.xml");
FileOutputStream fos = new FileOutputStream(dataFile);
String data = getStringFromInputStream(is);
fos.write(data.getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
nameAddressList = parser.parseXML(is);
}
else {
try {
File dataFile = new File(path,"data.xml");
FileInputStream fis = new FileInputStream(dataFile);
DataInputStream in = new DataInputStream(fis);
nameAddressList = parser.parseXML(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
nameAddressList = parser.parseXML(getInputStream("data.xml"));
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ConnectException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
ListOfPlacesAdapter listOfPlacesAdapter = new ListOfPlacesAdapter(ListOfPlacesActivity.this, nameAddressList);
listView.setAdapter(listOfPlacesAdapter);
listView.setItemsCanFocus(true);
spinner.dismiss();
}
private InputStream getInputStream(String fileName){
InputStream inputStream = null;
try {
inputStream = getAssets().open(fileName);
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
}
private String getStringFromInputStream(InputStream is) {
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
上面的代码不能正常工作,也没有给出错误。请告诉我哪里出错了。
答案 0 :(得分:0)
您可以考虑使用Android同步适配器并定期/手动将XML文件从服务器同步到本地存储,反之亦然。当网络连接可用时,Android将负责同步。这是教程的链接
http://developer.android.com/training/sync-adapters/index.html
最佳方法是始终使用本地xml文件进行更新,并在更新后将其与服务器同步,从而确保客户端和服务器具有相同的版本。您可以在更新本地文件后手动调用同步适配器,这将触发与服务器的立即同步。在同步期间,如果存在异常(EG: - 网络不可用)通过设置右侧标志将同步设置为重试。当网络再次可用时,同步适配器将负责重试。当服务器数据从另一个用户/应用程序更改时,向您的应用程序发送GCM广播消息并使用该广播消息再次触发同步,以便本地副本从服务器获取最新版本。您可以使用时间戳来决定哪一个是最新的