【问题标题】:Return a string from an anonymous class从匿名类返回一个字符串
【发布时间】:2015-05-07 10:26:45
【问题描述】:

我有一个 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);
}

【问题讨论】:

  • 您说的是callback,但我认为class Callback 没有用处。 i used a callback in it to return a value to the called activity but it prevents new activity from starting because of some problems in context。你可以详细说明一下。
  • 我通过接口使用回调。使用wsi.successCallback(response,context);

标签: java android android-activity callback android-volley


【解决方案1】:

您尚未在尝试开始新活动的地方发布活动代码。如果您可以在此处分享该部分以及错误日志(如果有),将会很有帮助。

如果您尝试从调用 Activity 中的回调启动 Activity,请记住在主线程中执行此操作(假设 Web 服务是从主线程以外的线程调用的)。

其他值得一提的输入是 - 从您的回调到活动,不需要回传上下文。它会在活动中随时可用。

您可以使用以下代码:

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

【讨论】:

    【解决方案2】:

    定义你的回调接口(我假设你已经有了这个,WebServiceInterface 是回调接口)。

    你的Activity应该实现这个接口。

    WebServiceAdapter 构造函数中添加参数WebServiceInterface。构造函数应将其存储在私有成员变量中。

    当您的Activity 创建WebServiceAdapter 的实例时,它应该将this 作为WebServiceInterface 参数传递。

    当您想回调Activity 时,只需调用存储的私有成员变量即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多