AsyncTask DoInBackground下载Google Spreadsheets数据返回Null?

时间:2016-07-28 05:37:07

标签: android json android-asynctask google-sheets

以下是代码:

    @Override
public String doInBackground(String... params)
{
    try
    {
        URL url = new URL("http://spreadsheets.google.com/tq?key=BLAHBLOAHBLAH");

        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); //Cast HttpUrlConnection because URL does not contain methods available to url, creates object
        httpURLConnection.setRequestMethod("GET"); //Request data from source
        httpURLConnection.setDoInput(true);
        httpURLConnection.connect(); //Object actually connects, connect() invoked by getInputStream() etc.

        //Reads data from network stream
        InputStream inputStream = httpURLConnection.getInputStream();

        //Rather than read one character at a time from the network or disk, BufferedReader reads a larger block at a time
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        //Used to create mutable string e.g. append()
        StringBuilder stringBuilder = new StringBuilder();
        String line = "";

        //Change stream data to StringBuilder data
        while ((line = bufferedReader.readLine()) != null)
        {
            stringBuilder.append(line + "\n");
        }

        String result = stringBuilder.toString();

        bufferedReader.close();
        inputStream.close();
        httpURLConnection.disconnect();

        return result;

    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    return null;

}

我基本上是从Google Spreadsheets下载JSON数据,但是从doInBackground函数返回的结果继续返回某种null对象引用。这是什么意思?...

修改* 这是我的logcat:

07-28 12:41:30.289 3796-3891/com.example.steven.app E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
                                                                        Process: com.example.steven.app, PID: 3796
                                                                        java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                            at android.os.AsyncTask$3.done(AsyncTask.java:309)
                                                                            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                            at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
                                                                            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                            at java.lang.Thread.run(Thread.java:818)
                                                                         Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.AlertDialog.setMessage(java.lang.CharSequence)' on a null object reference
                                                                            at com.example.steven.database.DownloadGS.doInBackground(DownloadGS.java:95)
                                                                            at com.example.steven.database.DownloadGS.doInBackground(DownloadGS.java:49)
                                                                            at android.os.AsyncTask$2.call(AsyncTask.java:295)
                                                                            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                                                                            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                                            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                                            at java.lang.Thread.run(Thread.java:818) 

在String结果中实际存储的内容的图片... enter image description here

2 个答案:

答案 0 :(得分:2)

我的问题是:

URL url = new URL("http://spreadsheets.google.com/tq?key=BLAHBLOAHBLAH");

我通过阅读这里发现: URLConnection Doesn't Follow Redirect

  

setFollowRedirect和setInstanceFollowRedirects仅在重定向协议相同时自动工作。即从http到http和https到https。 (Shalvika)

我将声明更改为:

URL url = new URL("https://spreadsheets.google.com/tq?key=BLAHBLOAHBLAH");

答案 1 :(得分:0)

您的代码看起来很好,问题是您不能从该网址获取数据。

点击此网址"http://spreadsheets.google.com/tq?key=BLAHBLOAHBLAH"

我得到了以下回复,所以我猜你从服务器获得了access denied

google.visualization.Query.setResponse (
{
   "version": "0.6",
   "status": "error",
   "errors": [
   {
     "reason": "access_denied",
     "message": "Access denied",
     "detailed_message": "Access denied"
   }]
}
)