只有在AsyncTask中运行时才会发生java.io.FileNotFoundException

时间:2016-06-27 16:03:07

标签: android android-asynctask

我有一个奇怪的问题;如果我运行此代码,我会得到一个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);
        }
    }
}

2 个答案:

答案 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()获得回复。我的问题是相应编辑的。请忽略其他答案,但没有提供任何解决方案。