Android java.io.FileNotFoundException仅在异步任务内部运行时发生
我有一个奇怪的问题;如果运行此代码,我会得到一个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
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
中,然后在其中执行所有初始化<