如何在内部存储中创建,写入和读取XML文件

时间:2014-10-15 22:47:16

标签: android xml

我正在开发一个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();

    }
}

上面的代码不能正常工作,也没有给出错误。请告诉我哪里出错了。

1 个答案:

答案 0 :(得分:0)

您可以考虑使用Android同步适配器并定期/手动将XML文件从服务器同步到本地存储,反之亦然。当网络连接可用时,Android将负责同步。这是教程的链接

http://developer.android.com/training/sync-adapters/index.html

最佳方法是始终使用本地xml文件进行更新,并在更新后将其与服务器同步,从而确保客户端和服务器具有相同的版本。您可以在更新本地文件后手动调用同步适配器,这将触发与服务器的立即同步。在同步期间,如果存在异常(EG: - 网络不可用)通过设置右侧标志将同步设置为重试。当网络再次可用时,同步适配器将负责重试。当服务器数据从另一个用户/应用程序更改时,向您的应用程序发送GCM广播消息并使用该广播消息再次触发同步,以便本地副本从服务器获取最新版本。您可以使用时间戳来决定哪一个是最新的