我有一个LoginActitvity,其中包含两个用于用户名和密码的文本字段以及一个登录按钮。当用户按下按钮时,应用程序将启动异步任务。异步任务实现了我的VolleyHandler。它检查登录参数是否正确并获取一些用户数据(使用volley和json)。执行此操作时,会出现ProgressDialog。当异步任务完成时,它会在onPostExecute方法中启动对MainActivity的意图。
现在我的问题是:在异步任务中发出排球请求是一个好主意,还是你有更好的解决方案?
感谢。
答案 0 :(得分:0)
你不能使用asynctask。 Volley关心它。您可以使用回调来处理数据和ui。 看起来像这样:
public class LoginActivity extends SinglePaneActivity implements DownloadCallback {
//...
public void sendRequest(){
Downloader download = new Download(this);
downloader.download(userName, password);
progresbar.show();
}
public void requestFinish(){
progersbar.dismis();
//... continue
}
}
回调:
public interface DownloadCallback {
void requestFinish();
}
在类下载程序中
private RequestQueue requestQueue;
DownloadCallback mcallback;
public void Downloader(DownloadCallback callback){
mCallback = callback;
requestQueue = Volley.newRequestQueue(mContext);
initVolleyListeners();
}
private void initVolleyListeners() {
mSuccessListener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
mCallback.requestFinish();
}
};
mErrorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mCallback.requestFinish();
}
};
public void download(String user, String pass){
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, createJson(user, pass), mSuccessListener , mErrorListener ) {
//header for send JSON to server
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
requestQueue.add(jsonObjectRequest );
}
还有一点。不要在json中发送用户名。你把它作为param发送到标题中。使用此application/x-www-form-urlencoded
并设置将用户名传递为标题中的params。
<强>更新强> 现在它会起作用。对不起,我赶紧写了。 Article about how callback work