2015-11-12 34 views
0

我一直在努力理解Android JSON解析與凌空庫的邏輯。我試圖獲得JSON數組並解析了Volley庫。我理解JSON數據是如何從PHP文件中提取的,但是我遇到了很大的問題。 makeJsonArrayRequest()函數正確運行並從get_data.php文件中解析JSON數組,並在每次迭代中從用戶類添加用戶ArrayList。我分別在onCreate和userLogin函數中調用了此函數。用戶的大小當我調用makeJsonArrayRequest()時,ArrayList等於0。函數在onCreate方法中。但是,當我在userLogin方法中調用makeJsonArrayRequest()函數時,用戶的大小等於非零數字(單擊登錄按鈕時調用此方法)。這是我的問題。爲什麼makeJsonArrayRequest() Create()方法?Android JSON解析排球庫?

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ET_NAME = (EditText) findViewById(R.id.user_name); 
    ET_PASS = (EditText) findViewById(R.id.user_pass); 
    pDialog = new ProgressDialog(this); 
    pDialog.setMessage("Please wait..."); 
    pDialog.setCancelable(false); 
    makeJsonArrayRequest(); 
    Toast.makeText(getApplicationContext(),"Size:" + users.size(),Toast.LENGTH_LONG).show(); 

} 


public void userLogin(View view) { 
    login_name = ET_NAME.getText().toString(); 
    login_pass = ET_PASS.getText().toString(); 
    String method = "login"; 
    String status = "1"; 
    BackgroundTask backgroundTask = new BackgroundTask(this); 
    backgroundTask.execute(method, login_name, login_pass, status); 
    Intent i = new Intent(this,MapsActivity.class); 
    i.putExtra("username",login_name); 
    i.putExtra("userpass", login_pass); 
    makeJsonArrayRequest(); 
    startActivity(i); 
    Toast.makeText(getApplicationContext(),"Size:" + users.size(),Toast.LENGTH_LONG).show(); 
} 

private void makeJsonArrayRequest() { 


    showpDialog(); 

    JsonArrayRequest req = new JsonArrayRequest(JSON_URL, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        Log.d(TAG, response.toString()); 

        try { 
         // Parsing json array response 
         // loop through each json object 


         jsonResponse =""; 
         for (int i = 0; i < response.length(); i++) { 


          JSONObject person = (JSONObject) response.get(i); 

          String name = person.getString("name"); 
          String username = person.getString("username"); 
          String password = person.getString("password"); 
          double latitude = Double.parseDouble(person.getString("latitude")); 
          double longitude = Double.parseDouble(person.getString("longitude")); 
          String status = person.getString("status"); 

          User user = new User(name,username,password,latitude,longitude,status); 

          users.add(user); 

         } 



        } catch (JSONException e) { 
         e.printStackTrace(); 
         Toast.makeText(getApplicationContext(), 
           "Error: " + e.getMessage(), 
           Toast.LENGTH_LONG).show(); 
        } 
        hidepDialog(); 


       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      Toast.makeText(getApplicationContext(), 
        error.getMessage(), Toast.LENGTH_SHORT).show(); 
      hidepDialog(); 

     } 
    }); 

    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(req); 
} 
+0

在嘗試之前,您的Log響應語句中是否有任何區別? 'Log.d(TAG,response.toString());' – napkinsterror

+0

如果沒有顯示日誌語句,可能是因爲你試圖在'onCreate()'中顯示一個對話框,但是你可能沒有正確地做到這一點。在showDialog()之前和之後放置一條日誌語句,以確保它不會在那裏崩潰。 – napkinsterror

+0

我不認爲這個問題背後的原因是與showDialog()。我嘗試了很多方法來解決這個問題,但我無法處理它。 – MurodoBaggins

回答

0

如果你的意思是:

我的onCreate運行請求()和檢查 - 它是空的。

然後:

我再次運行它後,並檢查 - 它的全部。

那麼你有沒有考慮請求延遲?它需要時間(雖然 - 沒有太多時間)請求返回,您可能在它之前檢查

編輯: 在onResponse()中運行您想要的內容,僅在請求返回時調用它。

希望這會有所幫助。