1

Web サービスからいくつかのデータを取得し、それらをカスタム ListView に配置するこの小さなアプリケーションを作成しました。

ソープコール

public String getVoy(String voy) {
    String SOAP_ACTION = "XXXXXXXXXX";
    String METHOD_NAME = "XXXXXXXXXX";
    String NAMESPACE = "urn:DefaultNamespace";
    String URL = "http://xxxxxxxxxxxx/xxxxx.nsf/xxxxxxx?wsdl";

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("VOY", voy);
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);
        final SoapObject result = (SoapObject) envelope.bodyIn;
        rt = (result != null) ? result.getProperty(0).toString() : "Nessuna risposta 1";

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } // Invio il webservice

    return rt;
}

非同期タスク

 private class LineCall extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        final String text = WebService.getInstance().getVoy(params[0]);

        return text;
    }
}

AsyncTask を呼び出してデータを取得する

LineCall line = new LineCall();
    line.execute(voy);

    try {
        **string** = line.get();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

次に、文字列変数を取得し、データを分割してカスタム リストに入れます...

非常にうまく機能しますが、問題は非常に遅いため、ProgressDialogを作成しようとしましたが、いくつかの問題があります...

前のアクティビティに入れたら:

 Button partenze = (Button) findViewById(R.id.partenze);
    partenze.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            StartDeapartures call = new StartDeapartures();
            call.execute();

        }
    });
}
private class StartDeapartures extends AsyncTask<Void, Void, Void> {

    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        dialog = new ProgressDialog(Home.this);
        dialog.setTitle("Loading..");
        dialog.setCancelable(false);
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        Intent intent = new Intent(getApplicationContext(), Partenze.class);
        startActivity(intent);
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        dialog.dismiss();
    }

}

進行状況の画像が動かず、フリーズしているように見えます。それを LineCall asyncTask に入れると、ProgressDialog が表示されません...

これは string = line.get(); が原因であることがGoogleでわかりました。実行に時間がかかる...

get() が動作しているときに ProgressDialog を配置するにはどうすればよいですか?

4

1 に答える 1

1

を呼び出すとAsyncTask.get()、完了するまでメイン スレッドがブロックされdoInBackgroundます。したがって、 を呼び出すのではなく、結果を処理してメソッドAsyncTask.get()で UI 操作を行う必要があります。AsyncTask.onPostExecute()これは の設計された動作ですAsyncTask

StartDepartures asynctask で、なぜ doInBackground でアクティビティを開始するのですか? アクティビティを開始するために AsyncTask を使用するポイントは何ですか?

于 2013-11-03T20:21:06.207 に答える