如何从ASyncTask获取结果?

时间:2012-12-28 23:18:39

标签: android android-asynctask

我正在尝试连接到本地网络中的主机。到达它可以从我的电脑或我的Android手机(SGS2)工作,它似乎也可以使用我的应用程序,但我想得到一个结果,以检查它是否有效,并取决于继续进行进一步的行动。

我正在使用ASyncTask的实现,名为Connector。 当我调用Connector时,我不仅调用execute而且调用get()以接收表示成功的布尔值。这里的问题是执行正常(主机肯定已到达,我在doInBackground的断点处着陆。

但是如何才能收到我在doInBackground中返回的布尔值? 当我打电话给get()时,它永远不会结束......

基本上,我关心的是变量“connected”,但get()似乎永久运行! 权限在清单中被授予,我的手机上的wifi启用并运行,我可以到达主机。

这是我执行连接器的地方:

url = new URL("http://192.168.2.103/?LED=T");
            Connector connector = new Connector();
            AsyncTask<URL, Integer, Boolean> execute = connector
                    .execute(url);
            Status status = execute.getStatus();
            boolean connected = false;
            try {
                Log.d("MainActivity", "trying to get result");
                connected = connector.get();
                Log.d("MainActivity", "got result");
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            } catch (ExecutionException ee) {
                ee.printStackTrace();
            }
            System.out.println();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        //do something depending on connected

这是连接器:

public class Connector extends AsyncTask<URL, Integer, Boolean> {

public static boolean connect(URL url) {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url.toString());
    System.out.println();

    try {
        HttpResponse response = httpclient.execute(httppost);
        int statusCode = response.getStatusLine().getStatusCode();
        Log.d("myapp", "response " + response.getEntity());
    } catch (ClientProtocolException e) {
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

@Override
protected Boolean doInBackground(URL... params) {
    boolean connect = connect(params[0]);

    return connect;
}

@Override
protected void onPostExecute(Boolean result) {
    Log.d("Connector", "onPostExecute");
    super.onPostExecute(result);
}

}

1 个答案:

答案 0 :(得分:1)

我认为您不想调用get(),因为您已经使用execute()运行了AsyncTask。如果您只想查看正在设置的已连接变量,请使用Lof中的onPostExecute(),因为doInBackground的结果会发送给它。如果您需要对其执行某些操作,那么您也可以在onPostExecute()中执行此操作