如何在没有新的可运行线程的情况下使用HTTPPost

时间:2012-09-21 06:38:39

标签: android json http-post

我的MainAcitivity内有以下代码,用于使用方法jsnrqstr.sendRequest(username, password, URL);

采用的用户名和密码登录应用程序
loginButton.setOnClickListener(
        new View.OnClickListener()
        {
            public void onClick(View view)
            {
                username = userNameBox.getText().toString();
                password = passwordBox.getText().toString();
                login_state = jsnrqstr.sendRequest(username, password, URL);
                if(login_state.equals("ok")){
                    details.setUserName(username);
                    details.setPassword(password);
                    Toast.makeText(MainActivity.this, "User Verified", Toast.LENGTH_LONG).show();
                    passwordBox.setText("");
                    Intent myIntent = new Intent(MainActivity.this, DashBoardActivity.class);
                    MainActivity.this.startActivity(myIntent);
                }else
                    Toast.makeText(MainActivity.this, "Login Unsuccessful", Toast.LENGTH_LONG).show();
                    passwordBox.setText("");
            }
        });

此方法使用以下代码从erlang服务器接收响应,该服务器使用JSON对象进行响应,我可以从中接收login_state。 jsnrqstr.sendRequest(username, password, URL);

的代码
public class JSONRequester {

String state;

public String sendRequest(final String userName, final String password, final String URL){

    new Thread(new Runnable() {
        public void run() {
            HttpClient client = new DefaultHttpClient();
            HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
            HttpResponse response;
            JSONObject json = new JSONObject();
            try{
                HttpPost post = new HttpPost(URL);
                post.setHeader("Content-type", "application/json");
                json.put("username", userName);
                json.put("password", password);
                StringEntity se = new StringEntity( json.toString());
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);
                response = client.execute(post);
                /*Checking response */
                if(response!=null){
                    String temp = EntityUtils.toString(response.getEntity()); //Get the data in the entity
                    //Log.v("response", temp);
                    JsonObject o = new JsonParser().parse(temp).getAsJsonObject();
                    Log.v("response", o.get("state").toString());
                    state = o.get("state").toString();
            }}
            catch(Exception e){
                e.printStackTrace();
                //createDialog("Error", "Cannot Estabilish Connection");
            }
        }
      }).start();
          return state;
}

但我得到以下空指针异常 @

if(login_state.equals("ok")){

这意味着我没有正确地从上面的方法返回login_state值。我认为这是因为当新的可运行线程返回值时,为时已晚。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果依赖返回值,则应该在线程完成时使用一些将开始执行代码的回调。或者你可以启动新线程,等待它返回之前再做其他事情。

答案 1 :(得分:1)

问题出在两行之间:) - 这两个:

})开始();

< == HERE !!!

  return state;

第二个过早地执行,而你的线程仍在运行。并发是解决方案。

一种常见的Android特定模式是AsyncTask - http://developer.android.com/reference/android/os/AsyncTask.html - 或其类似物(线程/处理程序等)

单击,在onPreExecute(sendRequest之前的代码)中启动进程:例如,打开进度对话框并执行初始化。您的线程的代码进入doInBackground方法并设置状态变量。完成后,在onPostExecute中,关闭进度对话框,然后继续使用您的登录逻辑:if(/*response*/ state!=null) ...