Android java.io.FileNotFoundException仅在异步任务内部运行时发生

Android java.io.FileNotFoundException仅在异步任务内部运行时发生,android,android-asynctask,Android,Android Asynctask,我有一个奇怪的问题;如果运行此代码,我会得到一个java.io.FileNotFoundException:。仅当我在我的AsyncTask中调用client.getInputStream()时才会发生这种情况。单击链接:它显然有效。 让我们把这个案例称为1 现在,当我在我的AsyncTask之外运行完全相同的代码时,我得到一个NetworkOnMainThreadException,但是client.getInputStream()可以工作… 考虑这种情况2。 我知道为什么在案例2中会出现Ne

我有一个奇怪的问题;如果运行此代码,我会得到一个java.io.FileNotFoundException:。仅当我在我的
AsyncTask
中调用
client.getInputStream()
时才会发生这种情况。单击链接:它显然有效。
让我们把这个案例称为1

现在,当我在我的
AsyncTask
之外运行完全相同的代码时,我得到一个NetworkOnMainThreadException,但是
client.getInputStream()
可以工作…
考虑这种情况2。

我知道为什么在案例2中会出现
NetworkOnMainThreadException
,但我不明白为什么
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.os.AsyncTask;
导入android.util.Log;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.util.Scanner;
导入javax.net.ssl.HttpsURLConnection;
公共类临时工{
私有字符串getResponse(InputStream){
扫描仪s=新扫描仪(流)。使用分隔符(\\A”);
试一试{
stream.close();
}捕获(IOE异常){
e、 printStackTrace();
}
返回s.hasNext()?s.next():“”;
}
公共无效运行(字符串url){
URL-uri;
HttpsURLConnection客户端=null;
试一试{
uri=新URL(URL);
客户端=(HttpsURLConnection)uri.openConnection();
客户端.setReadTimeout(15*1000);
}捕获(IOE异常){
e、 printStackTrace();
}
新建RetrieveStream().execute(客户端);
}
私有类RetrieveStream扩展异步任务{
private String returnString=null;//不要更改此值!
HttpsURLConnection客户端;
@凌驾
受保护字符串doInBackground(HttpsURLConnection…客户端){
试一试{
this.client=client[0];
InputStream=this.client.getInputStream();
Log.d(getClass().getSimpleName(),“response:+getResponse(this.client.getInputStream());
}catch(filenotfounde异常){
Log.d(getClass().getSimpleName(),“错误输出:”+getResponse(this.client.getErrorStream());
e、 printStackTrace();
}捕获(IOE异常){
Log.d(getClass().getSimpleName(),“error:+getResponse(this.client.getErrorStream());
e、 printStackTrace();
}
this.client.disconnect();
返回字符串;
}
受保护的void onPostExecute(字符串输出){
d(getClass().getSimpleName(),“输出:”+output);
}
}
}

我并不深入android开发,但由于线程似乎知道连接(由“NetworkOnMainThreadException”暗示),我建议将URL实例移交给AsyncTask并在那里打开连接,而不是移交客户端

除此之外,通过阅读api,我希望

client.connect();
以前

client.getInputStream();
有人打电话来

参考资料:


我对android开发没有深入了解,但由于线程似乎知道连接(由“NetworkOnMainThreadException”暗示),我建议将URL实例移交给AsyncTask并在那里打开连接,而不是移交客户端

除此之外,通过阅读api,我希望

client.connect();
以前

client.getInputStream();
有人打电话来

参考资料:


不太清楚为什么会发生
FileNotFoundException
,但是我能够用
.getErrorStream()
而不是
.getInputStream()
获得响应。我的问题作了相应的编辑。请忽略其他答案,它们没有提供解决方案。

不太清楚为什么会出现
FileNotFoundException
,但我能够使用
.getErrorStream()
而不是
.getInputStream()
获得响应。我的问题作了相应的编辑。请忽略其他答案,它们没有提供解决方案。

您打开连接,然后将其传递到
异步任务中,这有点奇怪。您是否尝试过将
URL
传递到
AsyncTask
,然后在
doInBackground()
中执行所有初始化操作?@NoChinDeluxe它只是有点奇怪;这是我实际类的一个简单示例,它有设置头、请求方法等的方法。当然,所有这些都发生在
AsyncTask
之外。但是这个简单的示例仍然不起作用。无论这是真实的代码还是示例,在后台线程之外初始化连接,然后将打开的连接传递到另一个线程都是很奇怪的。这很奇怪,我打赌这就是问题所在。我会尝试在
doInBackground()
中执行所有连接初始化,包括头和其他所有内容。这可能会让您感到奇怪。对我来说,这很有道理。如果我在
AsyncTask
外部初始化
HttpsUrlConnection
并将其传递给
doInBackground
,或者如果我传递
URL
并在
AsyncTask
内部初始化,则没有区别。不应该,因为这不是一个静态类。如果它是一个静态类,您可能会发现一些问题。我试过了,但还是犯了同样的错误;)您打开连接,然后将其传递到
AsyncTask
中,这有点奇怪。您是否尝试过将
URL
传递到
AsyncTask
中,然后在其中执行所有初始化<