将值从Service异步方法返回到Activity

时间:2016-02-12 02:10:09

标签: java android asynchronous

我有一个Service类,我用它来使用Volley进行Web服务调用:

public class AccountService {
    public static void forgotPassword(Context c, String emailAddress) {

        String url = "myUrl";

        JsonArrayRequest request = new JsonArrayRequest(url,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        // done
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });

        Volley.newRequestQueue(c).add(request);

    }

}

我从这样的活动中调用它:

public class ForgotPasswordActivity extends AppCompatActivity implements View.OnClickListener{

    private void submit() {
        accountService.forgotPassword();
    }
}

当Volley请求完成后,我想更新我的活动中的UI。考虑到它是异步请求,我该怎么做?我可以在活动中调用AccountService类中的方法吗?谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

将侦听器对象传递给AccountService,然后将通信成功或错误发送到活动。

按照以下方式尝试(您不应将布局传递给AccountService,否则会产生一些不必要的问题)

public class ForgotPasswordActivity extends AppCompatActivity 
                 implements View.OnClickListener,   
                                   AccountServiceCallback{

       private void submit() {
                AccountService.forgotPassword("email@123.com", this);
       }


       @Override
       public void onClick(View v) {

       }

      @Override
      public void onResponse(JSONArray response) {
             // UPDATE UI as per on response requirement
      }

      @Override
      public void onErrorResponse(VollyError error) {
             // UPDATE UI as per response flow
      }
}

public class AccountService {

    public static void forgotPassword(Context c, String email, final    
                       AccountServiceCallback callback) {

           String url = "myUrl";

           JsonArrayRequest request = new JsonArrayRequest(url,
                            new Response.Listener<JSONArray>() {
                      @Override
                      public void onResponse(JSONArray response) {
                             // done
                             callback.onResponse(response);
                      }
            }, new Response.ErrorListener() {
           @Override
           public void onErrorResponse(VolleyError error) {
                callback.onErrorResponse(error);
           }
       });

      Volley.newRequestQueue(c).add(request);

     }

   interface AccountServiceCallback {
       public void onResponse(JSONArray response);
       public void onErrorResponse(VollyError error);
   }
 }

答案 1 :(得分:-1)

您必须找到一种方法将后台工作的结果返回到主线程,以便它可以更改视图层次结构。有很多方法可以做到这一点,而且大多数都不是很好。

但在你这样做之前,你的代码存在问题。首先,如果您认为自己制作了Android服务组件,那么实际上并没有这样做。你创建了一个名为AccountService的类,它在Android世界中没什么特别的。

其次,您对forgetPassword()的调用不传递任何参数,但您在AccountService中对forgotPassword()的定义具有完全不同的签名。这不会编译。

您应该开始学习特定于Android的异步编程模式,并在编写代码之前制定解决问题的策略,因为如果不了解您最初在做什么,几乎肯定会做错。