2013-05-18 152 views
0

我們已經在我們的應用程序中使用this code來從在線數據庫獲取數據,但是無論我們嘗試過什麼,它都會根據專輯和持續時間持續說「null」作爲輸出。這可能是一個非常小的細節,但是因爲我們正在開發開發人員,所以我們對JSON並不瞭解太多。有沒有人有任何建議?Android java JSON解析'null'作爲輸出

package com.example.androidhive; 

import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.Html; 
import android.util.Log; 
import android.widget.TextView; 

import com.example.androidhive.helper.AlertDialogManager; 
import com.example.androidhive.helper.ConnectionDetector; 
import com.example.androidhive.helper.JSONParser; 

public class SingleTrackActivity extends Activity { 
    // Connection detector 
    ConnectionDetector cd; 

    // Alert dialog manager 
    AlertDialogManager alert = new AlertDialogManager(); 

    // Progress Dialog 
    private ProgressDialog pDialog; 

    // Creating JSON Parser object 
    JSONParser jsonParser = new JSONParser(); 

    // tracks JSONArray 
    JSONArray albums = null; 

    // Album id 
    String album_id = null; 
    String song_id = null; 

    String album_name, song_name, duration; 

    // single song JSON url 
    // GET parameters album, song 
    private static final String URL_SONG = "http://api.androidhive.info/songs/track.php"; 

    // ALL JSON node names 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_DURATION = "duration"; 
    private static final String TAG_ALBUM = "album"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_single_track); 

     cd = new ConnectionDetector(getApplicationContext()); 

     // Check if Internet present 
     if (!cd.isConnectingToInternet()) { 
      // Internet Connection is not present 
      alert.showAlertDialog(SingleTrackActivity.this, "Internet Connection Error", 
        "Please connect to working Internet connection", false); 
      // stop executing code by return 
      return; 
     } 

     // Get album id, song id 
     Intent i = getIntent(); 
     album_id = i.getStringExtra("album_id"); 
     song_id = i.getStringExtra("song_id"); 

     // calling background thread 
     new LoadSingleTrack().execute(); 
    } 

    /** 
    * Background Async Task to get single song information 
    * */ 
    class LoadSingleTrack extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(SingleTrackActivity.this); 
      pDialog.setMessage("Loading song ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     /** 
     * getting song json and parsing 
     * */ 
     protected String doInBackground(String... args) { 
      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      // post album id, song id as GET parameters 
      params.add(new BasicNameValuePair("album", album_id)); 
      params.add(new BasicNameValuePair("song", song_id)); 

      // getting JSON string from URL 
      String json = jsonParser.makeHttpRequest(URL_SONG, "GET", 
        params); 

      // Check your log cat for JSON reponse 
      Log.d("Single Track JSON: ", json); 

      try { 
       JSONObject jObj = new JSONObject(json); 
       if(jObj != null){ 
        song_name = jObj.getString(TAG_NAME); 
        album_name = jObj.getString(TAG_ALBUM); 
        duration = jObj.getString(TAG_DURATION);      
       }   

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after getting song information 
      pDialog.dismiss(); 

      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 

        TextView txt_song_name = (TextView) findViewById(R.id.song_title); 
        TextView txt_album_name = (TextView) findViewById(R.id.album_name); 
        TextView txt_duration = (TextView) findViewById(R.id.duration); 

        // displaying song data in view 
        txt_song_name.setText(song_name); 
        txt_album_name.setText(Html.fromHtml("<b>Album:</b> " + album_name)); 
        txt_duration.setText(Html.fromHtml("<b>Duration:</b> " + duration)); 

        // Change Activity Title with Song title 
        setTitle(song_name); 
       } 
      }); 

     } 

    } 
} 
+3

你可以發佈由http返回的json嗎? – Blackbelt

+0

我訪問了PHP頁面,迴應是空的。可以這樣做嗎?你有沒有得到任何迴應?使用Log.v打印並在logcat中檢查 –

+0

您提到的鏈接(http://api.androidhive.info/songs/track.php),沒有可用的數據。因此,請檢查一次並檢查您收到的http響應,嘗試打印日誌並進行檢查。 – surender8388

回答

2

看着你鏈接到的教程,看來這是一個請求會是什麼樣子:

http://api.androidhive.info/songs/track.php?album=3&song=1 

和反應是:

{"id":1,"name":"Born to Die","duration":"4:46","album_id":"3","album":"Lana Del Rey - Born to Die"} 

鑑於...你的JSON解析沒有任何問題。

您需要驗證「專輯」(album_id)和「歌曲」(song_id)參數是您在執行GET時所認爲的參數。

如果PHP腳本爲空(例如http://api.androidhive.info/songs/track.php?album=&song=),則它不會返回任何數據,如果它們不能識別,則只返回no album。這看起來就是發生了什麼,因此您的程序的輸出值爲null

+0

因此,如果我們填寫參數,問題應該解決? – user2397035