【问题标题】:HttpAsyncTask returns null as dataHttpAsyncTask 返回 null 作为数据
【发布时间】:2014-10-08 14:41:12
【问题描述】:

我们在让 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

请帮忙

问候

康荣

【问题讨论】:

    标签: java android android-asynctask httprequest


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!当我们添加 onPostExecute 方法时它起作用了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2018-09-14
    • 2021-10-02
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多