我的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
值。我认为这是因为当新的可运行线程返回值时,为时已晚。我该怎么做才能解决这个问题?
答案 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)
...