我有一个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类中的方法吗?谢谢你的帮助
答案 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的异步编程模式,并在编写代码之前制定解决问题的策略,因为如果不了解您最初在做什么,几乎肯定会做错。