【问题标题】:How to read a file in Internet with Android Studio with AsyncTask?如何使用带有 AsyncTask 的 Android Studio 读取 Internet 中的文件?
【发布时间】:2016-10-30 01:02:45
【问题描述】:

我在连接到带有 android studio 的服务器以读取文件 txt 时遇到问题。 然后,我使用 AsyncTask,但问题是当我打开我的应用程序并尝试该功能时,它给了我错误。 这是代码:

private class LongOperation extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        URL url = null;
        try {
            url = new URL("http://tmtsite.altervista.org/Agata/in.txt");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        URLConnection conn = null;
        try {
            conn = url.openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BufferedReader rd = null;
        try {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        String line = "";
        StringBuilder builder = new StringBuilder(16384);
        try {
            while ((line = rd.readLine()) != null) {


                builder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return builder.toString();
    }

    @Override
    protected void onPostExecute(String result) {

    }

    @Override
    protected void onPreExecute() {}

    @Override
    protected void onProgressUpdate(Void... values) {}
    }
}

这是堆栈跟踪:

  06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime: Process: damasoft.agata, PID: 22354
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground()
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at android.os.AsyncTask$3.done(AsyncTask.java:309)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:  Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.lookupHostByName(InetAddress.java:464)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.getAllByName(InetAddress.java:215)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:220)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:176)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:108)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:482)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:465)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:447)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:468)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at damasoft.agata.MainActivity$LongOperation.doInBackground(MainActivity.java:111)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at damasoft.agata.MainActivity$LongOperation.doInBackground(MainActivity.java:95)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at 
android.os.AsyncTask$2.call(AsyncTask.java:295)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:  Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at libcore.io.Posix.android_getaddrinfo(Native Method)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.lookupHostByName(InetAddress.java:451)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.getAllByName(InetAddress.java:215) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:220) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:176) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:108) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:482) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:465) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:447) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:468) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at damasoft.agata.MainActivity$LongOperation.doInBackground(MainActivity.java:111) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at damasoft.agata.MainActivity$LongOperation.doInBackground(MainActivity.java:95) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:  Caused by: android.system.ErrnoException: android_getaddrinfo failed: EACCES (Permission denied)
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at libcore.io.Posix.android_getaddrinfo(Native Method) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.lookupHostByName(InetAddress.java:451) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.net.InetAddress.getAllByName(InetAddress.java:215) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:220) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:176) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:108) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:482) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:465) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:447) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:468) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at damasoft.agata.MainActivity$LongOperation.doInBackground(MainActivity.java:111) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at damasoft.agata.MainActivity$LongOperation.doInBackground(MainActivity.java:95) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    06-28 11:12:52.761 22354-22567/damasoft.agata E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 

【问题讨论】:

  • 请跟踪堆栈。

标签: android file android-studio server


【解决方案1】:

正如 Logcat 所说的

原因:java.lang.SecurityException: Permission denied (missing 互联网权限?)

确保您已在 Manifest 文件中定义 Internet 权限。

使用这个

<uses-permission android:name="android.permission.INTERNET"/>

所以你的manifest.xml 文件看起来像这样

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.project"> 
<uses-permission android:name="android.permission.INTERNET"/>

【讨论】:

  • @Elia D'Amato 很高兴为您提供帮助。
  • 非常感谢
【解决方案2】:

请显示堆栈跟踪,但可以观察到的一件事是您没有在获得 inputStream 之前调用 connect 方法。这是文档中的内容:

  1. 连接对象是通过调用 openConnection 创建的 URL 上的方法。
  2. 设置参数和一般请求属性 被操纵。
  3. 与远程对象的实际连接已建立, 使用连接方法。
  4. 远程对象变为可用。可以访问远程对象的标头字段和内容。

做:

conn.connect();

之前:

rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多