【发布时间】:2015-12-14 03:09:22
【问题描述】:
我是 Android 和 Volley 的新手,需要您的帮助。 我需要发布一个字符串,有一个 json 来响应它,如果它没有引发错误的请求,则使用来自我的请求的一些值开始一个新的意图。
这是我想要做的简单架构: 按登录按钮 -> 星请求 -> 检查是否正常 -> 使用响应值启动新意图。
我看到 Volley 使用异步方法进行查询。 这是我的代码:
boolean temp=false;
login.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
boolean temp=false;
if (!id.getText().toString().isEmpty() && !pw.getText().toString().isEmpty()) {
temp = verifyCredentials(v.getContext()); //Doesn't work because Volley is asynchronous.
if(temp==true)
{
Intent intentMain = new Intent(v.getContext(), MainActivity.class);//MainActivity.class);
intentMain.putExtra("username", id.getText().toString());
startActivityForResult(intentMain, 0);
}
} else {//strighe vuote
//toast
Toast.makeText(v.getContext(), "Compila i campi", Toast.LENGTH_SHORT).show();
}
}
});
public boolean verifyCredentials(Context context) {
final boolean[] tempToReturn = {false};
mTextView = (TextView) findViewById(R.id.textView2);
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest stringRequest = new StringRequest(Request.Method.POST, apiURL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
mTextView.setText("Response is:" + response.substring(500));
tempToReturn[0] =true;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String json = null;
NetworkResponse response = error.networkResponse;
if(response != null && response.data != null){
switch(response.statusCode){
case 400:
json = new String(response.data);
json = trimMessage(json, "message");
if(json != null) displayMessage(json);
break;
}
//Additional cases
}
mTextView.setText("Error bad request");
}
public String trimMessage(String json, String key){
String trimmedString = null;
try{
JSONObject obj = new JSONObject(json);
trimmedString = obj.getString(key);
} catch(JSONException e){
e.printStackTrace();
return null;
}
return trimmedString;
}
//Somewhere that has access to a context
public void displayMessage(String toastString){
mTextView.setText("Response is:" +toastString);
}
}){
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
AuthenticationUserName = id.getText().toString();
AuthenticationPassword = pw.getText().toString();
params.put("grant_type", Authenticationgrant_type);
params.put("username", AuthenticationUserName);
params.put("password", AuthenticationPassword);
return params;
}
};
queue.add(stringRequest);
return tempToReturn[0];
}
我正在使用 Volley,因为我的 gradle 是 23 和我的 APi 级别,所以我不能使用 apache 包。
编辑:新代码:
public void onClick(View v) {
boolean temp = true;
if (!id.getText().toString().isEmpty() && !pw.getText().toString().isEmpty()) {
myContext = v.getContext();
VolleyResponseListener listener = new VolleyResponseListener() {
@Override
public void onError(VolleyError error) {
String json = null;
NetworkResponse response = error.networkResponse;
if(response != null && response.data != null){
switch(response.statusCode){
case 400:
json = new String(response.data);
json = trimMessage(json, "message");
if(json != null) displayMessage(json);
break;
}
//Additional cases
}
mTextView.setText("Error bad request");
}
@Override
public void onResponse(JSONObject response) {
try {
fullName = response.getString("fullName");
token= response.getString("access_token");
expirationDate=response.getString(".expires");
} catch (JSONException e) {
e.printStackTrace();
}
mTextView.setText("Response is:" + fullName+token+expirationDate);
Intent intentMain = new Intent(myContext, MainActivity.class);//MainActivity.class);
intentMain.putExtra("username", id.getText().toString());
startActivityForResult(intentMain, 0);
}
public String trimMessage(String json, String key){
String trimmedString = null;
try{
JSONObject obj = new JSONObject(json);
trimmedString = obj.getString(key);
} catch(JSONException e){
e.printStackTrace();
return null;
}
return trimmedString;
}
//Somewhere that has access to a context
public void displayMessage(String toastString){
//Toast.makeText(MainActivity.this, toastString, Toast.LENGTH_LONG).show();
mTextView.setText("Response is:" +toastString);
}
};
verifyCredentials(myContext,listener);
我已经创建了这个界面:
public interface VolleyResponseListener {
void onError(VolleyError error);
void onResponse(JSONObject response);
}
这是我的验证凭证的新代码:
public boolean verifyCredentials(Context context,final VolleyResponseListener listener) {
final boolean[] tempToReturn = {false};
mTextView = (TextView) findViewById(R.id.textView2);
Map<String,String> params = new HashMap<String, String>();
AuthenticationUserName = id.getText().toString();
AuthenticationPassword = pw.getText().toString();
//key value
params.put("grant_type", Authenticationgrant_type);
params.put("username", AuthenticationUserName);
params.put("password", AuthenticationPassword);
RequestQueue queue = Volley.newRequestQueue(context);
SimpleRequest jsObjRequest = new SimpleRequest(Request.Method.POST, apiURL,
params,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
listener.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onError(error);
}
}
});
queue.add(jsObjRequest);
return tempToReturn[0];
}
【问题讨论】:
-
之前只显示一个进度对话框,当请求完成时volley会自动调用回调响应或错误
-
@MamataGelanee 这个网址是我的个人Api,我不会分享它....对不起
-
@SacreDeveloper 你能给我发一些示例代码吗?谢谢
-
看看下面的@BNK答案,它应该对你有帮助:)
标签: android json android-studio android-volley