HttpAsyncTask返回null作为数据

时间:2014-10-08 14:41:13

标签: java android android-asynctask httprequest

我们遇到一个问题,让HttpASyncTask从我们简单的http函数返回一个String: 简单地说,我们希望能够将数据发送到URL并接收适当的响应,我们稍后可以在其他类中使用。 httpsndler类确实收到了正确的响应,直到某一点。

这是我们的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]);
    }
}

}

这是另一个班级&#39;必须从http处理程序接收数据的函数:

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

请帮忙

此致

Cong Vinh

1 个答案:

答案 0 :(得分:2)

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

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