【问题标题】:AsyncTask DoInBackground downloading Google Spreadsheets Data Returning Null?AsyncTask DoInBackground 下载谷歌电子表格数据返回空值?
【发布时间】:2026-02-12 15:45:01
【问题描述】:

代码如下:

    @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 电子表格下载 JSON 数据,但从 doInBackground 函数返回的结果继续返回某种空对象引用。这是什么意思?...

编辑* 这是我的日志:

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) 

实际存储在字符串结果中的图片...

【问题讨论】:

  • 你怎么知道的?发布你的日志猫?
  • 我在帖子中添加了我的 logcat。我添加了一个 alertDialog 来打印(测试字符串是否存在......)我的 doInBackground 函数将返回的字符串结果。然后该结果应该可以在稍后用于我的 postExecute 函数,以便我可以将结果转换为 JSONobject。

标签: android json android-asynctask google-sheets


【解决方案1】:

我的问题是:

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

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

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

我把语句改成:

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

【讨论】:

    【解决方案2】:

    您的代码看起来不错,问题是您不允许从该 URL 获取数据。

    点击此网址"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"
       }]
    }
    )
    

    【讨论】:

    • 我在代码中放入的谷歌电子表格是一个虚拟链接。我允许所有人编辑和修改的实际链接,只要他们有链接。