0

ローカルネットワークのホストに接続しようとしています。コンピューターまたはAndroidフォン(SGS2)からアクセスでき、アプリでも機能するようですが、結果を取得して機能するかどうかを確認し、それに応じてさらにアクションを進めます。

Connectorという名前のASyncTaskの実装を使用しています。Connectorを呼び出すときは、executeを呼び出すだけでなく、成功を示すブール値を受け取るためにget()も呼び出します。ここでの問題は、executeが正常に実行されることです(ホストに確実に到達し、doInBackgroundのブレークポイントに到達します。

しかし、doInBackgroundで返すブール値をどのように受け取ることができますか?get()を呼び出すと、終了しません...

基本的に、私が気にしているのは変数 "connected"ですが、get()は永続的に実行されているようです。マニフェストで権限が付与され、電話のWi-Fiが有効になって機能し、ホストにアクセスできます。

ここでConnectorを実行します。

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);
}

}

4

1 に答える 1

1

get()で AsyncTask を既に実行しているので、呼び出したくないと思いますexecute()。接続された変数が設定されていることを確認したいだけの場合は、からの結果が送信されるため、 a を使用Lofします。それを使って何かをする必要がある場合は、それを行うこともできますonPostExecute()doInBackgroundonPostExecute()

于 2012-12-28T23:33:34.343 に答える