gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:58:39 25 4
gpt4 key购买 nike

我的 MainAcitivity 中有以下代码,用于使用方法 jsnrqstr.sendRequest(username, password, URL); 获取的用户名和密码登录到应用程序/p>

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("");
}
});

此方法使用以下代码从使用 JSON 对象响应的 erlang 服务器接收响应,我可以从中接收 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 值。我认为这是因为当新的可运行线程返回值时为时已晚。我可以做些什么来解决这个问题?

最佳答案

问题在字里行间:) - 这两个:

}).开始();

<== 这里!!!

  return state;

第二个被提前执行,而您的线程仍在运行。并发是解决方案。

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

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

关于android - 如何在没有新的可运行线程的情况下使用 HTTPPost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12525413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com