2016-06-27 6 views
1

私は奇妙な問題があります。このコードを実行すると、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); 
     } 
    } 
} 
+1

接続を開いて、それを 'AsyncTask'に渡すのは少し奇妙です。 'AsyncTask'に' URL'を渡してみましたか?代わりに 'doInBackground()'の中で初期化をすべてやっていますか? – NoChinDeluxe

+0

@NoChinDeluxeそれは奇妙なaprearsです。これは私の実際のクラスの裸のミニマムの例で、ヘッダを設定するメソッド、メソッドを要求するメソッドなどがあります。このすべては、AsyncTaskの外で発生します。しかし、この裸の最小例はまだ動作しません。 – slinden77

+0

これが実際のコードであるかどうかにかかわらず、バックグラウンドスレッドの外部接続を初期化してから、開いている接続を別のスレッドに渡すのは奇妙です。それは奇妙なことであり、私はそれが問題だと賭けています。 'doInBackground()'の中でヘッダやその他のものを含めて、あなたの接続initをすべて試してみるでしょう。 – NoChinDeluxe

答えて

0

FileNotFoundExceptionが発生した理由は非常に明確ではないのですが、私は.getErrorStream()の代わり.getInputStream()で応答を得ることができました。それに応じて私の質問が編集されます。他の答えを無視してください、彼らは解決策を提供しません。

0

私はアンドロイドの開発に深くないけど、スレッドので、(「NetworkOnMainThreadException」で暗示)接続を意識するように見える、私はあなたのAsyncTaskへのハンドオーバにURLインスタンスを提案し、そこに接続を開きたいです、代わりにクライアントを手渡す。

これとは別に、APIを読み込むことで、私はと呼ばれる

client.connect(); 

client.getInputStream(); 

前のgetのを期待したいです。

参考文献:

https://developer.android.com/reference/java/net/URL.html#openConnection() https://developer.android.com/reference/java/net/URLConnection.html#getInputStream()

+0

こんにちは、お返事ありがとうございます。私のクラスでは 'javax.net.ssl.HttpsURLConnection'が使用されています。確かに、私は 'クライアントでそれを試しました。connect() 'は、同じエラーです。 URLインスタンスを引き渡しても何も修正されません。 – slinden77

+0

java.net.HttpUrlConnection https://developer.android.com/reference/java/net/HttpURLConnection.htmlでは '.connect'は必要ありません。これは何も解決しない理由を説明しています... – slinden77

関連する問題