java.io.FileNotFoundException仅在AsyncTask内部运行时发生



我有一个奇怪的问题;如果我运行这段代码,我得到一个java.io.FileNotFoundException: https://graph.facebook.com/debug_token?input_token=1234&access_token=1234。只有当我在AsyncTask中调用client.getInputStream()时才会发生这种情况。点击链接:它显然有效。
我们称这种情况为1。

现在,当我在AsyncTask之外运行完全相同的代码时,我得到一个networkonmainthreadeexception,但client.getInputStream()工作…
2.

我知道为什么我得到NetworkOnMainThreadException在情况2,但我不明白为什么FileNotFoundException只发生在情况1,而不是在情况2。代码是一样的!我已经看了几个小时了,我就是不知道我做错了什么。

编辑:显然FileNotFoundException是由于错误响应码而发生的。当异常发生时,我通过使用.getErrorStream()获得错误流来解决这个问题。

import android.os.AsyncTask;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
import javax.net.ssl.HttpsURLConnection;
public class Temp {
    private String getResponse(InputStream stream){
        Scanner s = new Scanner(stream).useDelimiter("\A");
        try {
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return s.hasNext() ? s.next() : "";
    }
    public void run(String url){
        URL uri;
        HttpsURLConnection client = null;
        try {
            uri = new URL(url);
            client = (HttpsURLConnection) uri.openConnection();
            client.setReadTimeout(15*1000);
        } catch (IOException e) {
            e.printStackTrace();
        }
        new RetrieveStream().execute(client);
    }
    private class RetrieveStream extends AsyncTask<HttpsURLConnection, Void, String> {
        private String returnString = null; //don't change this!
        HttpsURLConnection client;
        @Override
        protected String doInBackground(HttpsURLConnection... client) {
            try {
                this.client = client[0];
                InputStream stream = this.client.getInputStream();
                Log.d(getClass().getSimpleName(), "response: "+getResponse(this.client.getInputStream()));
            } catch (FileNotFoundException e) {
                Log.d(getClass().getSimpleName(), "error output: "+getResponse(this.client.getErrorStream()));
                e.printStackTrace();
            } catch (IOException e) {
                Log.d(getClass().getSimpleName(), "error: "+getResponse(this.client.getErrorStream()));
                e.printStackTrace();
            }
            this.client.disconnect();
            return returnString;
        }
        protected void onPostExecute(String output) {
            Log.d(getClass().getSimpleName(), "output: "+output);
        }
    }
}

我不是深入android开发,但由于线程似乎意识到连接(由"NetworkOnMainThreadException"暗示),我建议将URL实例移交给你的AsyncTask并打开连接,而不是移交客户端。

除此之外,通过阅读api,我希望有一个
client.connect();

之前
client.getInputStream();

叫做。

引用:

https://developer.android.com/reference/java/net/URL.html openConnection ()https://developer.android.com/reference/java/net/URLConnection.html getInputStream ()

这不是很清楚为什么FileNotFoundException发生,但我能够得到.getErrorStream()而不是.getInputStream()的响应。我的问题经过了相应的编辑。

请忽略其他答案,它们没有提供解决方案。

相关内容

  • 没有找到相关文章

最新更新