android - 调用 AsyncTask.get() 时的 ProgressBar

标签 android web-services android-asynctask

我编写了这个小应用程序,它从网络服务中获取一些数据并将它们放入自定义 ListView 中:

SOAP 调用

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

然后我使用 string 变量,拆分我的数据并将它们放入自定义列表中......

它工作得很好,但问题是很慢所以我尝试创建一个 ProgressDialog 但有一些问题......

如果我把它放在之前的 Activity 中:

 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();这需要很长时间才能运行...

那么我如何在 get() 工作时放置 ProgressDialog 呢?

最佳答案

如果调用 AsyncTask.get(),它将阻塞主线程,直到 doInBackground 完成。因此,您不应调用 AsyncTask.get(),而应在 AsyncTask.onPostExecute() 方法中处理结果并执行 UI 操作。这是 AsyncTask 的设计行为。

在您的 StartDeapartures 异步任务中,为什么要在 doInBackground 中启动一个 Activity ?使用 AsyncTask 启动 Activity 有什么意义?

关于android - 调用 AsyncTask.get() 时的 ProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19757341/

相关文章:

java - SSLHandshakeException : Certificate Unknown (Java Spring Boot & Android)

java - 如何将数据推送到客户端的服务器

java - Restful WS 如何同时处理多个客户端?

java - java/Android 一个进度条下载多个文件

android - 无法更新从 json 创建的 getstream Activity

android - 在运行时将行和键添加到 android 中的自定义键盘

android - 更新 Android 中方向变化的进度条

java - ArrayException越界

android - 将 OnGestureListener 添加到按钮?

java - 模拟 Java Web 服务的最佳方式