我有一个奇怪的问题;如果我运行此代码,我会得到一个java.io.FileNotFoundException:https://graph.facebook.com/debug_token?input_token=1234&access_token=1234。只有当我在client.getInputStream()
内拨打AsyncTask
时,才会出现这种情况。点击链接:它显然有效。
我们称这个案例为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);
}
}
}
答案 0 :(得分:0)
我没有深入到android开发,但由于Thread似乎意识到连接(暗示为“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()
答案 1 :(得分:0)
不清楚FileNotFoundException
为什么会发生,但我能够通过.getErrorStream()
代替.getInputStream()
获得回复。我的问题是相应编辑的。请忽略其他答案,但没有提供任何解决方案。