2015-06-20 162 views
-1

嗨夥計我創建一個Android應用程序的登錄/註冊部分使用Android Volley庫。我的應用程序運行良好,但UI和邏輯處於同一個班級。所以,我把它們分成兩類。我的應用使用POST方法向我的NodeJS服務器發出請求並獲取JSON響應。所以我試圖將POST請求函數保留在另一個類中。在返回函數之前等待JSON響應?

分離類後,我在等待響應時出現問題。這是功能;

public String doWebRequestLogin(Context context, boolean checkLoginForm, final Map<String,String> json){ 
     result[0] = "FREE"; 
     this.context = context; 

     if(checkLoginForm){ 

      StringRequest post = new StringRequest(Request.Method.POST, loginUrl, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        try { 
         Log.d("Login Response: ",response); 
         data = response; 
         res = new JSONObject(data); 
         if (res.getString(KEY_SUCCESS) != null) { 
          int success = Integer.parseInt(res.getString(KEY_SUCCESS)); 
          if (success == 1) { 
           result[0] = "LOGGED"; 
          } else if (success == 0) { 
           result[0] = "LOGIN ERROR"; 
          } else { 
           result[0] = "INVALID POST"; 
          } 
         } 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.d("Response Error", error.toString()); 
        result[0] = "INVALID POST"; 
       } 
      }){ 
       @Override 
       protected Map<String, String> getParams() throws AuthFailureError { 
        Map<String,String> map = json; 

        return map; 
       } 
      }; 

      VolleyController.getInstance(this.context).getRequestQueue().add(post); 

     } 

     return result[0]; 
    } 

由於響應時間,此函數每次都返回結果[0]爲「FREE」。它如何等待響應並根據響應設置結果[0]?我需要知道發出請求時發生了什麼。

+0

「它如何根據響應等待響應並設置結果[0]?」 - 除非您在自己的後臺線程上調用'doWebRequestLogin()',請不要等待響應。換句話說,不要通過等待網絡I/O來阻塞主應用程序線程。 – CommonsWare

+0

不幸的是,我在onclick函數中調用了UI上的doWebRequestLogin()。我錯過了什麼,在UI元素中使用它是一個壞主意? –

+1

爲什麼這個標記的node.js?這看起來像Java代碼。 – jfriend00

回答

2

我打電話doWebRequestLogin( )在onclick函數內的用戶界面

然後你做不是想「等待迴應」。無論網絡I/O需要多長時間,這會凍結您的用戶界面,而您的用戶將不會感到印象深刻。

取而代之的是,在onResponse()onErrorResponse()方法中更新您的UI。

這種通過回調處理結果的異步調用是Android核心的事件驅動編程模型的核心。

+0

你是對的。其實,我的應用程序工作正常。在進行重構時,我想分離UI事物和網絡事物,但是這個onResponse()運行時間使得很難分離。我只是好奇設計模式在這種情況下的行爲。無論如何,我遵循你所說的話。 –

2

該請求是異步的,並且您的一定不能阻止主線程等待響應。使方法無效並在收到響應後使用回調來處理響應。

public void doWebRequestLogin(SomeCallback callback, Context context, boolean checkLoginForm, final Map<String,String> json){ 
    [...] 
    if (res.getString(KEY_SUCCESS) != null) { 
     int success = Integer.parseInt(res.getString(KEY_SUCCESS)); 
     callback.someMethod(success); 
    } 
} 

回調:

public interface SomeCallback{ 
    void someMethod(int result); // response received, handle it 
} 

回調也可以有返回類型或者是通用的,這完全取決於你的需要......

+0

根據回調,我的應用程序會觸發一些UI元素。在這種情況下,我無法分離UI和邏輯。 –

相關問題