我有一个奇怪的问题;如果我运行这段代码,我得到一个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()
的响应。我的问题经过了相应的编辑。