我们有一个问题让HttpASyncTask从我们简单的http函数返回一个String:
简单来说,我们希望能够将数据发送到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
执行的结果返回。
在postExecuted
类的HttpAsyncTask
方法中处理结果(此处未实现,但可以覆盖)。这是可以确保在进行HTTP调用并接收到结果之后将执行处理的唯一正确方法。