2014-10-08 54 views
2

我们有一个问题让HttpASyncTask从我们简单的http函数返回一个字符串: 简单地说,我们希望能够将数据发送到一个URL并接收一个适当的响应,我们可以稍后在其他类中使用。直到某一点,httphandler类才会收到正确的响应。HttpAsyncTask返回null作为数据

这里是我们的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 

请帮助

Regards

Cong Vinh

回答

2

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

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

谢谢!它在我们添加onPostExecute方法时起作用 – 2014-10-08 16:19:41