2016-07-28 7 views
1

Hier ist der Code:AsyncTask DoInBackground Herunterladen von Google Spreadsheets Data Returning Null?

@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; 

} 

ich im Grunde die JSON-Daten von Google Tabellen bin Download, aber das Ergebnis aus der doInBackground Funktion zurück weiterhin eine Art von einem Null-Objektverweis zurückzukehren. Was bedeutet das ...

EDIT * Hier ist mein 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)  

Bild von dem, was tatsächlich in String Ergebnis gespeichert wird ... enter image description here

+1

Woher wissen Sie das? Veröffentlichen Sie Ihren Logcat? –

+0

Ich habe meinen Logcat zum Beitrag hinzugefügt. Ich habe einen alertDialog hinzugefügt, um auszugeben (zu testen, ob der String da ist oder nicht ...), das String-Ergebnis, das von meiner doInBackground-Funktion zurückgegeben würde. Dann hätte dieses Ergebnis später für meine postExecute-Funktion verfügbar sein sollen, damit ich das Ergebnis in ein JSON-Objekt konvertieren kann. – LinearM

Antwort

2

Mein Problem war:

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

Ich fand heraus, dass hier durch das Lesen: URLConnection Doesn't Follow Redirect

die setFollowRedirect und setInstanceFollowRedirects nur automatisch funktionieren, wenn die umgeleiteten Protokoll gleich ist. zB von http zu http und von https zu https. (Shalvika)

änderte ich die Aussage:

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

Ihr Code sieht gut aus, das Problem ist, dass Sie keine Daten von dieser URL erhalten dürfen.

Auf Schlagen diese URL "http://spreadsheets.google.com/tq?key=BLAHBLOAHBLAH"

Ich erhalte Antwort nach, so dass ich denke, Sie werden immer access denied vom Server.

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

Die Google-Tabellen, die ich in meinen Code eingegeben habe, sind Dummy-Links. Der eigentliche Link, den ich jedem erlauben durfte, zu bearbeiten und zu modifizieren, solange sie den Link haben. – LinearM

Verwandte Themen