2016-06-11 3 views
0

Я новичок в библиотеке Volley, я создаю простое приложение для Android, которое берет данные из API, который генерируется в JSON. После отладки только эта конкретная функция fetchAccD, упомянутая ниже, имеет проблемы с задержкой с Android Volley. Другие функции в рамках этой деятельности и других видов деятельности, которые подразумевают, что JsonObjectRequest работает отлично.Volley: onResponse в запросе с задержкой JsonObjectRequest

{ 
    "Account": { 
     "remarks": "NIL" 
     "uname": "admin" 
     "pword": null // value not to be shown 
     "key": 1316451 
     "name": "msummons sudo" 
    } 
} 

Вот мой текущий код

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_dashboard); 
    uName = getIntent().getStringExtra("username"); 
    // reset session 
    authidCoDe = 0; 

    // invoke session 
    Account account = fetchAccD(uName); 

    if (account != null) { 
     authidCoDe = account.getKey(); 
     ... 


// init user details before loading 
private final Account fetchAccD (String userN) { 
    final Account account = new Account(); 
    requestQueue = null; 
    requestQueue = Volley.newRequestQueue(this); 
    String urlConstruct = *json url*; 

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, urlConstruct, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         JSONArray jsonArray = response.getJSONArray("Account"); 
         JSONObject jsonObject = jsonArray.getJSONObject(0); 
         account.setUname(jsonObject.optString("uname")); 
        // account.setPword(jsonObject.optString("pword")); 
         account.setKey(jsonObject.optInt("key")); 
         account.setName(jsonObject.optString("name")); 
         account.setRemarks(jsonObject.optString("remarks")); 
         requestQueue.stop(); 
        } 
        catch (JSONException e) { 
         Toast.makeText(getApplicationContext(), "Fetch failed!", Toast.LENGTH_SHORT).show(); 
         requestQueue.stop(); 
        } 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(getApplicationContext(), "Fetch failed!", Toast.LENGTH_SHORT).show(); 
      requestQueue.stop(); 
     } 
    }); 
    requestQueue.add(jsonObjectRequest); 
    return account; 
} 

При вызове fetchAccD, код работает идеально до

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, urlConstruct, 
     new Response.Listener<JSONObject>() 

Затем он переходит к onCreate, где он работает по методу fetchAccD

if (account != null) { 
    authidCoDe = account.getKey(); 
    ... 

Перед тем, как вернуться к остальной части метода onResponse в методе fetchAccD.

@Override 
public void onResponse(JSONObject response) { 
    try { 
     JSONArray jsonArray = response.getJSONArray("Account"); 
     ... 

Я использовал JsonObjectRequest GET для большинства моих функций для извлечения JSON, эта проблема возникает только для функции fetchAccD. Благодаря!

ответ

0

onResponse асинхронный, он будет вызываться, когда сервер вернет ответ.

Таким образом, вы должны ждать ответа, прежде чем делать это:

if (account != null) { 
    authidCoDe = account.getKey(); 
    ... 
} 

onCreate должны сделать:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_dashboard); 
    uName = getIntent().getStringExtra("username"); 
    // reset session 
    authidCoDe = 0; 

    // invoke session 
    fetchAccD(uName); 
} 

В onResponse вы можете сделать:

public void onResponse(JSONObject response) { 

    try { 
     JSONArray jsonArray = response.getJSONArray("Account"); 
     JSONObject jsonObject = jsonArray.getJSONObject(0); 
     account.setUname(jsonObject.optString("uname")); 
    // account.setPword(jsonObject.optString("pword")); 
     account.setKey(jsonObject.optInt("key")); 
     account.setName(jsonObject.optString("name")); 
     account.setRemarks(jsonObject.optString("remarks")); 
     useAccount(account); 
     requestQueue.stop(); 
    } 
    catch (JSONException e) { 
     Toast.makeText(getApplicationContext(), "Fetch failed!", Toast.LENGTH_SHORT).show(); 
     requestQueue.stop(); 
    } 
} 

Определите метод useAccount:

private void useAccount(Account account) { 
    if (account != null) { 
     authidCoDe = account.getKey(); 
     ... 
    } 
} 

fetchAccD И не нужно возвращать значение, вы можете сделать это void.

+0

Спасибо! Он работает, но это значит, мой метод 'onCreate' может работать только до' fetchAccD (uName); '? Или нет? :) –

+0

Вы можете добавить больше вещей после 'fetchAccD'. Когда я говорю, что ваша активность должна ждать ответа, это не означает, что вы не можете делать другие вещи тем временем. Пожалуйста, отметьте ответ, как принято, если он работает для вас, спасибо! –

+0

Спасибо! Действительно оценил вашу помощь, вот мое одобрение :) –

Смежные вопросы