2015-05-07 3 views
0

У меня есть проект андроида, в котором я использую класс для отправки http-запросов с использованием библиотеки Volley. Это называется 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 (ответ, контекст);' – haseeb

ответ

0

Вы не указали код операции, где вы пытаетесь начать новую деятельность. Было бы полезно, если бы вы могли совместно использовать эту часть вместе с журналами ошибок, если таковые имеются.

В случае, если вы пытаетесь запустить действие из обратного вызова в вызывающей активности, не забудьте сделать это в главной теме (при условии, что веб-сервер вызывается из потока, отличного от основного потока).

Другие упоминания о достоинствах - от вашего обратного вызова до активности, контекст не требуется передавать обратно. Он был бы легко доступен там в деятельности.

вы можете использовать ниже код:

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

Определите интерфейс обратного вызова (я предполагаю, что у вас уже есть это и WebServiceInterface является интерфейс обратного вызова).

Ваш Activity должен реализовать этот интерфейс.

Добавить параметр WebServiceInterface в конструктор WebServiceAdapter. Конструктор должен хранить это в частной переменной-члене.

Когда ваш Activity создает экземпляр WebServiceAdapter, он должен пройти this в качестве параметра WebServiceInterface.

Если вы хотите перезвонить Activity, просто позвоните в хранимую переменную частного члена.

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