2015-05-07 98 views
0

我有一個android項目,我使用類來發送使用Volley庫的http請求。 它被稱爲WebServicesAdapter。我在其中使用回調函數將值返回給被調用的活動,但由於上下文中存在一些問題,它阻止了新活動的啓動。 如何在不使用回調的情況下返回一個字符串?從一個匿名類返回一個字符串

下面是我的代碼。當我想返回一個字符串時,successcallback是回調。

public class WebServiceAdapter { 

private static String BASE_URI = "http://192.168.42.94/getvoize/index.php"; 
private RequestQueue rQueue; 

public String responseString; 
public String status; 

Context context; 
public WebServiceAdapter(Context context){ 
    this.context = context; 
    status = "new"; 
    rQueue = Volley.newRequestQueue(context); 
} 

private WebServiceInterface wsi; 
public void sendGetRequest(String page,Map<String,String> map, WebServiceInterface i){ 
    wsi = i; 
    String query = ""; 
    if(!map.isEmpty()){ 
    for (Map.Entry<String, String> entry : map.entrySet()) 
    { 
     query =query + entry.getKey()+"="+entry.getValue()+'&'; 
    } 
    } 
    if(query.length() != 0) 
     query = query.substring(0,query.length()-1); 
    StringRequest sRequest = new StringRequest(Request.Method.GET,BASE_URI+page+"?"+query, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response){ 
        wsi.successCallback(response,context); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error){ 
        wsi.errorCallback("failed",context); 

       } 

      }); 
    rQueue.add(sRequest); 
} 
private Map<String,String> parameter; 
private Map<String,String> headers; 

public void sendPostRequest(String page,Map<String,String> body,Map<String,String> header,WebServiceInterface i){ 
    wsi = i; 
    parameter = body; 
    headers = header; 
    Log.d("place", "Inpost"); 
    StringRequest myReq = new StringRequest(Request.Method.POST, 
      BASE_URI+page, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response){ 
        wsi.successCallback(response, context); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error){ 
        wsi.errorCallback("Failed", context); 

       } 
      } 

      ) { 
     @Override 
     protected Map<String,String> getParams(){ 
      Map<String,String> params = parameter; 

      return params; 
      } 

      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String,String> params = headers; 
      return params; 
      } 
      }; 
      rQueue.add(myReq); 
} 
+1

你說的是「回調」,但我沒有看到'class Callback'的用法。 '我用回調函數將一個值返回給被調用的活動,但由於上下文中的某些問題,它阻止了新活動的啓動。你可以詳細說明這一點。 – greenapps

+0

我使用回調使用接口。使用'wsi.successCallback(response,context);' – haseeb

回答

0

您尚未在其中嘗試啓動新活動的活動代碼發佈。如果你可以在這裏分享這篇文章以及錯誤日誌(如果有的話),這將會很有幫助。

如果您試圖在調用Activity中從回調中啓動一個活動,請記住在主線程中執行它(假設web服務是從主線程以外的線程調用的)。

其他值得一提的是 - 從回調到活動,上下文不需要傳回。在活動中將很容易獲得。

您可以使用下面的代碼:

runOnUiThread(new Runnable() { 
    public void run() { 
    //startActivity code here. 
    } 
}); 
0

定義您的回調接口(我假設你已經有了這一點,WebServiceInterface是回調接口)。

你的Activity應該實現這個接口。

將參數WebServiceInterface添加到WebServiceAdapter的構造函數中。構造函數應該將其存儲在私有成員變量中。

當您的Activity創建WebServiceAdapter的實例時,它應該通過this作爲WebServiceInterface參數。

如果您想回撥Activity,只需撥打存儲的私有成員變量即可。