gpt4 book ai didi

java - HttpAsyncTask 返回 null 作为数据

转载 作者:行者123 更新时间:2023-11-30 09:01:47 25 4
gpt4 key购买 nike

我们在让 HttpASyncTask 从简单的 http 函数返回字符串时遇到问题:只是我们希望能够将数据发送到 URL 并接收到我们稍后可以在其他类中使用的正确响应。 httphandler 类在某个时间点之前确实收到了正确的响应。

这是我们的 httphandler:

public class HttpRequester extends Activity {

static String result;

public String createUser(String username) {
new HttpAsyncTask().execute("http://188.226.252.112/createPlayer.php?name=" + username);
System.out.println("ID at createUser is; " + result); // this also returns null
return result;
}

public static String GET(String url){
InputStream inputStream = null;

try {
// create HttpClient
HttpClient httpclient = new DefaultHttpClient();

// make GET request to the given URL
HttpResponse httpResponse = httpclient.execute(new HttpGet(url));

// receive response as inputStream
inputStream = httpResponse.getEntity().getContent();

// convert inputstream to string
if(inputStream != null)
result = convertInputStreamToString(inputStream);
else
result = "Did not work!";

} catch (Exception e) {
Log.d("InputStream", e.getLocalizedMessage());
}
System.out.println("ID at GET is; " + result); // this returns correct ID
return result;
}

private static String convertInputStreamToString(InputStream inputStream) throws IOException{
StringBuilder sb = new StringBuilder();
String something;
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
while ((something = bufferedReader.readLine()) != null) {
sb.append(something);
}
inputStream.close();
result = sb.toString();
System.out.println("ID at convert is; " + result); // this returns correct ID
return result;

}

public boolean isConnected(){
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(this.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
return true;
else
return false;
}

private class HttpAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
return GET(urls[0]);
}
}

这是另一个类的函数,它必须从 http 处理程序接收数据:

HttpRequester requester = new HttpRequester();
ID = requester.createUser(login);
System.out.println("ID in other class is: " + ID); // this returns null

请帮忙

问候

从荣

最佳答案

您的方法不正确。当您调用 new HttpAsyncTask().execute() 时,这会启动一个新的异步操作(在后台生成一个新线程)。 execute 方法立即返回并且 result 属性保持为空。这就是 createUser 方法返回 null 的原因。 GET 方法是同步的。在您的程序上下文中,它在单独的线程中执行(该线程从 HttpAsyncTask 开始),但其中的所有方法都一致地执行。这就是为什么此处的 result 属性被初始化并保存正确结果的原因。

  • 在不同线程之间共享属性(result 属性)不是一个好习惯。这可能是严重并发问题的根源。更好的方法是将此属性保留为 HttpAsyncTask 类的一部分,并将其作为 AsyncTask 执行的结果返回。
  • HttpAsyncTask 类的 postExecuted 方法中处理结果(此处未实现,但可以重写)。这是您可以确保在发出 HTTP 调用并收到结果后执行处理的唯一正确方法。

关于java - HttpAsyncTask 返回 null 作为数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26259724/

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