【问题标题】:Asynctask hangs on getInputStream()Asynctask 挂在 getInputStream()
【发布时间】:2019-01-21 19:58:26
【问题描述】:

我已经在我的 Android 应用程序的这一部分工作了几个小时,并且我已经阅读了至少 50 篇相关的帖子,但没有一篇有帮助。我有一个 AsyncTask 试图从网站上抓取文本。这应该很简单。

我已经有一个 Java Swing 程序,它调用非常相似的代码,它完全按照我想要的方式工作,所以我知道网站和我的互联网已经启动并正在运行。

当我尝试运行应用程序时,AsyncTask 在注释点挂起,我不知道为什么。

AsyncTask 内部的剥离版本:

@Override
protected void onPreExecute() {
    Log.wtf("PROGRESS", "in preex");
    //progress bar
}

@Override
protected String doInBackground(Void... params) {
    android.os.Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND + THREAD_PRIORITY_MORE_FAVORABLE);

    try {
        Log.wtf("PROGRESS", "in try");
        URLConnection connection = new URL("https://bmorgan17.github.io/html-database/").openConnection();
        Log.wtf("PROGRESS", "connect");
        Scanner scanner = new Scanner(connection.getInputStream()); //HANGS HERE
        Log.wtf("PROGRESS", "got stream");
        scanner.useDelimiter("\\Z");
        string = scanner.next();
        Log.wtf("PROGRESS", "read");
        scanner.close();
    } catch ( Exception ex ) {
        ex.printStackTrace();
        Log.wtf("FAILED", "Hard rip mate");
    }

    return string;
}

@Override
protected void onPostExecute(String s) {
    Log.wtf("PROGRESS", "in post");
    //hide progress bar
    delegate.processFinish(s);
}

Logcat:

01-21 13:36:53.039 14480-14480/com.example.name.stemapp A/PROGRESS: in preex
01-21 13:36:53.109 14480-14495/com.example.name.stemapp A/PROGRESS: in try
01-21 13:36:53.125 14480-14495/com.example.name.stemapp A/PROGRESS: connect

在最终的 logcat 条目之后,进度轮将永远旋转,任何帮助将不胜感激。

编辑:

在创建这篇文章和 15 到 20 分钟的 Reddit 冲浪之后,该应用程序终于继续前进。它进入了 catch 语句,然后是 postExecute,这显然不是我想要的。如果有人能帮我解决这个新问题,那就太好了。

Logcat:

A/PROGRESS: in preex
A/PROGRESS: in try
A/PROGRESS: connect
A/FAILED: hard rip mate
A/PROGRESS: in post

【问题讨论】:

  • 如何调用AsyncTask?
  • 发生了什么异常?它的堆栈跟踪是什么?
  • 设置连接超时有助于调试。 connection.setReadTimeout(5000)(5 秒)。 “如果在数据可供读取之前读取超时到期,则从返回的输入流读取时可能会引发 SocketTimeoutException”。
  • @ianhanniballake 在主 onCreate() 方法中使用 execute()。如果你愿意,我可以编辑我的帖子
  • 我每次运行它时都会遇到不同的异常,并且它们都没有发生在 printStackTrace() @Ruku

标签: java android android-asynctask java.util.scanner


【解决方案1】:

尝试添加:

connection.setDoInput(true);
int statusCode = connection.getResponseCode();
Log.wtf("PROGRESS", "status code: " + statusCode);

之前

Log.wtf("PROGRESS", "connect");

编辑:

也尝试添加:

connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type", "text/html; charset=utf-8");

之前:

int statusCode = connection.getResponseCode();

EDIT2:

我刚刚意识到您的网址以 https 开头,而您使用的是 HttpUrlConnection。将其更改为 HttpsUrlConnection。

【讨论】:

  • 挂在“int statusCode = connection.getResponseCode();”
  • 我忘记设置请求方法了,请现在试试。
  • 仍然挂在 getResponseCode()
  • 再试一次,这次也是请求属性 :-) 如果现在它会挂起,我放弃了。
  • 在添加 setRequestProperty() 后仍然在 getResponseCode() 处挂起
【解决方案2】:

首先,在 AndroidManifest.xml

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

试试这个:

    URL url;
    HttpURLConnection connection;
    String result = "";

    try {

        url = new URL("https://bmorgan17.github.io/html-database");
    //OPEN UP CONNECTION WITH URL
        connection = (HttpURLConnection) url.openConnection();
    //SET UP INPUT STREAM FOR DATA
        InputStream in = connection.getInputStream();
    //SET UP READER TO READ THE INCOMING DATA
        InputStreamReader reader = new InputStreamReader(in);
    //INPUT STREAM GETS DATA AS CHARACTERS SO THIS READS THE FIRST CHARACTER
        int data = reader.read();
    //LOOP THROUGH EACH CHARACTER UNTIL YOU GET ALL CONTENT REQUESTED
        while (data != -1) {
            char c = (char) data;
     //CONCATANATE TO STRING
            result += c;
            data = reader.read();
        }

        Log.i("Result", result);

        } catch ( Exception ex ) {
             ex.printStackTrace();
             Log.wtf("FAILED", "Hard rip mate");
        }

【讨论】:

  • 我是这样理解的。该代码总是对我有用,所以请尝试一下。
  • 调用getInputStream()时还是挂起
  • 我更新了我的回复。尝试在 AndroidManifest.xml 中添加它
猜你喜欢
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多