这是我的网络电话课程。这里执行一个方法networkCallByVolley,然后保存共享首选项的信息。
public class NetworkCall extends Activity {
Context context;
String res = "something";
SharedPreferences userDetails;
ArrayList<String> type = new ArrayList<String>();
ArrayList<String> value = new ArrayList<String>();
public NetworkCall(Context context){
this.context = context;
}
public void networkCallByVolley(final ArrayList<String> type, final ArrayList<String> value){
this.type = type;
this.value = value;
Log.i("type", type.toString());
Log.i("value", value.toString());
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest myReq = new StringRequest(Method.POST,
"http://My URL",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("rrrrr", response);
res = response;
userDetails = context.getSharedPreferences("userdetails", MODE_PRIVATE);
Editor edit = userDetails.edit();
edit.clear();
edit.putString("response", response);
edit.commit();
//Log.i("rrrrr", response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
//for(int i = 0; i<= params1.size(); i++)
for(int i =0 ; i< type.size(); i++){
params.put(type.get(i), value.get(i));
//params.put("password", "aaaaaa");
Log.i("typpppp", type.get(i));
}
return params;
};
};
queue.add(myReq);
}
public String getCharlie(){
userDetails = context.getSharedPreferences("userdetails", MODE_PRIVATE);
return userDetails.getString("response", "no value found");
}
public void clearCharlie(){
SharedPreferences.Editor edit = userDetails.edit();
edit.clear();
edit.commit();
}
}
当我尝试从登录活动中使用此类时,我收到以下日志“pref response”的消息是“找不到值”。如果再次运行我得到适当的回应,我期待。我不知道如何修复这个bug。任何帮助表示赞赏。 这是我的主要活动
public class Login extends Activity {
Button signup,submit;
EditText email,password;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
final NetworkCall net = new NetworkCall(getApplicationContext());
final ArrayList<String> type = new ArrayList<String>();
final ArrayList<String> value = new ArrayList<String>();
submit = (Button) findViewById(R.id.submit);
email = (EditText) findViewById(R.id.edittext_email);
password = (EditText) findViewById(R.id.edittext_pwd);
type.add("user_email");
type.add("user_password");
value.add(email.getText().toString().trim());
value.add(password.getText().toString().trim());
submit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
net.networkCallByVolley(type, value);
String response = net.getCharlie();
Log.i("pref resonse", response);
}
});
}
}
答案 0 :(得分:0)
您需要使用ASYNC任务或处理程序。 你正在做的是在调用net.networkCallByVolley(type,value)后立即调用getCharlie()方法;从服务器获取响应需要一些时间,之后只有它会将响应写入共享的prefrences。你没有找到任何结果,因为当时没有回应。 Respone正在另一个并行线程上计算。一旦该线程获得响应,它就会显示给您,但在此之前您将获得null。所以等待线程使用ASYNC任务获得响应。
@Override
public void onClick(View v) {
net.networkCallByVolley(type, value);
String response = net.getCharlie();
while(response.equalsIgnorecase("no result found")){}
Log.i("pref resonse", response);
}
答案 1 :(得分:0)
实际上你需要等到得到Volley的回应。
您可以在BroadcastReceiver
中使用Login Activity
从服务器收到回复后,从NetworkCall Activity
发送广播,当您收到广播时,请执行您要执行的操作,例如检查SharedPreferences
。
当您从服务器获得响应时,您可以使用Observer Pattern来获取通知。