Android: как получить данные по ссылке и прочитать их

Я пытаюсь прочитать файл .txt и .csv, который я добавил в свою общую папку Dropbox. Мне удалось прочитать данные и распечатать их с помощью java на моем компьютере, но когда я хочу прочитать и распечатать те же данные на Android, у меня возникают некоторые проблемы, и я не уверен, что я упускаю или делаю неправильно, вот мой код ( это то же самое, что и программа, которую я запускал на своем компьютере):

        try
        {
            URL dataLink = new URL(link);
            URLConnection dlc = dataLink.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(dlc.getInputStream())); //error happening here
            String inputLine;
            while ((inputLine = in.readLine()) != null) 
            {
                 System.out.println(inputLine);
            }

        }
        catch (MalformedURLException e) 
        {

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

Также вот ошибка, которую я получаю:


12-26 16:43:31.295: D/AndroidRuntime(4988): Shutting down VM
12-26 16:43:31.295: W/dalvikvm(4988): threadid=1: thread exiting with uncaught exception (group=0x41af5da0)
12-26 16:43:31.295: E/AndroidRuntime(4988): FATAL EXCEPTION: main
12-26 16:43:31.295: E/AndroidRuntime(4988): Process: com.src.readingdata, PID: 4988
12-26 16:43:31.295: E/AndroidRuntime(4988): android.os.NetworkOnMainThreadException
12-26 16:43:31.295: E/AndroidRuntime(4988):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1166)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.src.readingdata.GetData.onClick(GetData.java:65)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at android.view.View.performClick(View.java:4753)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at android.view.View$PerformClick.run(View.java:19562)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at android.os.Handler.handleCallback(Handler.java:733)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at android.os.Handler.dispatchMessage(Handler.java:95)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at android.os.Looper.loop(Looper.java:146)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at android.app.ActivityThread.main(ActivityThread.java:5635)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at java.lang.reflect.Method.invokeNative(Native Method)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at java.lang.reflect.Method.invoke(Method.java:515)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
12-26 16:43:31.295: E/AndroidRuntime(4988):     at dalvik.system.NativeStart.main(Native Method)

И добавленные мной разрешения: INTERNET, ACCESS_NETWORK_STATE, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE.

Любая помощь будет большим спасибо!

Кроме того, я впервые пишу здесь, так что извините, если я что-то не так сделал.


person plot    schedule 27.12.2014    source источник


Ответы (1)


Вам нужно использовать AsyncTask для выполнения сетевых операций в отдельном потоке. Android не разрешает сетевые операции в основном потоке для удобства пользователей.

Ознакомьтесь с этим руководством: http://developer.android.com/training/articles/perf-anr.html

person Wonil    schedule 27.12.2014
comment
Спасибо, чувак, это мне очень помогло и решило мою проблему! Еще одна проблема, с которой я столкнулся сейчас, заключается в том, что когда doInBackground завершается, он не вызывает onPostExecute, я думал, что он автоматически вызывает onPostExecute, когда doInBackgorund завершается? - person plot; 27.12.2014