第一次通话时,凌空响应为空

时间:2014-03-10 10:22:07

标签: android android-volley

这是我的网络电话课程。这里执行一个方法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);

        }
    });




}
}

2 个答案:

答案 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来获取通知。