android 从网络读取文本文件

android read textfile from web

我正在尝试从我的 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();

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

异常清楚地写着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

        }
}