私は奇妙な問題があります。このコードを実行すると、java.io.FileNotFoundExceptionが発生します。https://graph.facebook.com/debug_token?input_token=1234&access_token=1234これは私がAsyncTask
の中にclient.getInputStream()
と呼んだときにのみ発生します。リンクをクリックしてください:それははっきりと動作します。
私は私のAsyncTask
の外にまったく同じコードを実行したときのは、今すぐこの場合1.java.io.FileNotFoundExceptionは、AsyncTask内で実行された場合にのみ発生します。
を呼びましょう、私はNetworkOnMainThreadException得るが、client.getInputStream()
作品...
は2
は、私が知っているこのケースを考えてみましょうなぜ私はケース2でNetworkOnMainThreadException
を得るのですか?しかし、なぜFileNotFoundException
がケース1でのみ起こり、ケース2で起こるのか分かりません。コードは同じです!私はこれを何時間も見てきましたが、私が間違っていることは分かりません。
EDIT:エラー応答コードのために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);
}
}
}
接続を開いて、それを 'AsyncTask'に渡すのは少し奇妙です。 'AsyncTask'に' URL'を渡してみましたか?代わりに 'doInBackground()'の中で初期化をすべてやっていますか? – NoChinDeluxe
@NoChinDeluxeそれは奇妙なaprearsです。これは私の実際のクラスの裸のミニマムの例で、ヘッダを設定するメソッド、メソッドを要求するメソッドなどがあります。このすべては、AsyncTaskの外で発生します。しかし、この裸の最小例はまだ動作しません。 – slinden77
これが実際のコードであるかどうかにかかわらず、バックグラウンドスレッドの外部接続を初期化してから、開いている接続を別のスレッドに渡すのは奇妙です。それは奇妙なことであり、私はそれが問題だと賭けています。 'doInBackground()'の中でヘッダやその他のものを含めて、あなたの接続initをすべて試してみるでしょう。 – NoChinDeluxe