android从web读取文本文件

时间:2015-06-16 09:35:16

标签: java android onedrive

我试图从我的 onedrive 中读取文本文件,我需要检查数据库的版本并在必要时进行更新。

这是我的代码示例:

 private void checkVersion() {

    try {

        int dbversion = prefs.getInt("dbversion", 1);
        int dblastversion;


        URL url = new URL("");
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String str;

        str = in.readLine();

        in.close();

        System.out.println(str);

        dblastversion = Integer.valueOf(str);

        if (dbversion < dblastversion)
            System.out.println("updates available");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

当我尝试运行应用程序崩溃时,我从logcat得到了这个错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ex.example/com.ex.example.ActMenu}: android.os.NetworkOnMainThreadException

在这一行

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

有人知道是什么问题?或者它更好地使用另一个云来存储文本文件。谢谢你的帮助。

更新2

好的,因为GPRathour说我更新了我的代码:

class Getversion_Async extends AsyncTask<Void, Void, Void> {

    protected void onPreExecute() {
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        System.out.println("starting");
        try {

            URL url = new URL("https://onedrive.live.com/redir?resid=b9186f8cb138a030!56556&authkey=!AFmrzOGv_OMArzo&ithint=file%2ctxt");
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            String str;

            str = in.readLine();

            in.close();

            System.out.println(str);

        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(final Void unused) {

         System.out.println("ended");

    }
}

我打电话给onCreate这样测试:

 new Getversion_Async().execute();

好的,这段代码运行正常我使用一个站点来托管文件,链接以.txt结束并且工作正常但我无法编辑该文件。有人知道如何用onedrive做到这一点?

1 个答案:

答案 0 :(得分:1)

例外情况显然是android.os.NetworkOnMainThreadException。要从服务器读取文件,您需要执行一些网络操作,在Main Thread / UI Thread执行它不是一个好习惯,因为它会挂起UI直到执行操作。

您需要做的是,在AsyncTask

中运行此操作
class LogoutUser_Async extends AsyncTask<Void, Void, Void> {

        protected void onPreExecute() {
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            // Do your network task here

            return null;
        }

        @Override
        protected void onPostExecute(final Void unused) {

            // Process the result

        }
}