私はアンドロイドが初めてで、Web サービス API からいくつかのデータをフェッチするための非同期タスクの実装を試みていましたが、通常のシングル スレッド (UI メイン) 実装で正常に動作します。しかし、適切な実装とより良い UX のために AsyncTask に移行すると、ネットワーク メッセージをトリガーできません。誰かがここで何がうまくいかないのかを見つけるのを手伝ってくれませんか。コードスニペットをここに添付しています。
private class HttpConnector extends AsyncTask<String,String ,String>
{
private final String Name;
private final String setID;
private final String setCntrlValue;
private final String effDate;
HttpConnector(String aName,String aSetId, String aDate)
{
Name=aName;
setID=aSetId;
effDate=aDate;
}
String response="";
protected String doInBackground(String ... params)
{
response="";
String soapCall="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" ";
soapCall+=" xmlns:get=\"http://XXXX/GET_TREE_REQUEST.v1\">";
soapCall+="<soapenv:Header/>";
soapCall+="<soapenv:Body>";
soapCall+="<get:TreeData>";
soapCall+="<get:TreeName>"+Name.toString()+"</get:TreeName>";
soapCall+="<get:SETID>"+setID.toString()+"</get:SETID>";
soapCall+="<get:EFFDT>"+effDate.toString()+"</get:EFFDT>";
soapCall+="</get:TreeData>";
soapCall+="</soapenv:Body>";
soapCall+="</soapenv:Envelope>";
System.setProperty("socksProxyHost", "XXXX");
System.setProperty("socksProxyPort", "XX");
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
int timeoutConnection = 15000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 0;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
org.apache.http.client.HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpPost httppost = new HttpPost(URL);
httppost.setHeader("soapaction", "XXXX.v1");
httppost.setHeader("Content-Type", "text/xml; charset=utf-8");
try{
HttpEntity entity = new StringEntity(soapCall.toString(),HTTP.UTF_8);
httppost.setEntity(entity);
HttpResponse httpResponse = httpclient.execute(httppost);// calling server
InputStream content = httpResponse.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
return response;
}catch (UnsupportedEncodingException e) {
return e.getStackTrace().toString();
} catch (ClientProtocolException e) {
return e.getStackTrace().toString();
} catch (IOException e) {
return e.getStackTrace().toString();
}catch (Exception e)
{
return e.getStackTrace().toString();
}finally{
httpclient.getConnectionManager().shutdown();//shut down the connection
}
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String response) {
//super.onPostExecute(response);
txtResponse.setText(response);
}
}
public class FirstAppUI extends Activity
{
public void onClick(View v)
{
HttpConnector netConnect= new HttpConnector(txtTreeName.getText().toString(),txtSetId.getText().toString(),txtEffDate.getText().toString());
netConnect.execute();
txtResponse.setText("Waiting for the Server Response..!!");
}
}
そして、アクティビティ クラスから上記のように AsynTask をトリガーしています。そして、コード フローは httpclient.execute(httppost) 行で停止します。
ありがとう