简体   繁体   中英

Return a string from an anonymous class

I have an android project in which I use a class to send http requests using the Volley library. It is called WebServicesAdapter . I used a callback in it to return a value to the called activity but it prevents the new activity from starting because of some problems in the context. How can I return a string without using a callback?

Below is my code. successcallback is the callback when I want to return a string instead.

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);
}

You have not posted activity code where you are trying to start new activity. It would be helpful if you can share that piece here along with error logs if any.

In case you are trying to launch an activity from callback in the calling Activity, remember to do it in Main Thread (assuming the web servie is called from thread other than main thread).

Other input worth mentioning is - from your callback to activity, context is not required to be passed back. It would be readily available there in activity.

you can use below code:

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

Define your callback interface (I assume you already have this and WebServiceInterface is the callback interface).

Your Activity should implement this interface.

Add a parameter WebServiceInterface to the WebServiceAdapter constructor. The constructor should store this in a private member variable.

When your Activity creates an instance of WebServiceAdapter , it should pass this as the WebServiceInterface parameter.

WHen you want to call back the Activity , just make your calls on the stored private member variable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM