ローカルネットワークのホストに接続しようとしています。コンピューターまたは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);
}
}