【问题标题】:AsyncTask with Progress bar带进度条的 AsyncTask
【发布时间】:2017-12-11 16:24:12
【问题描述】:

我有一个应用程序,其中包含 3 个或更多按顺序调用的 AsycTask。因为这些异步任务都很相似,所以我创建了一个单独的类,它可以正常工作。

现在我想添加一个进度条,以便在这些异步任务询问并处理结果时显示一些内容......但不起作用。

我的应用程序如下:

  1. 我打开相机并使用 ZXing 库解码 qrCode
  2. 使用 HttpRequest 我向我的服务器询问一些信息,我的应用程序处理这些信息

关键是在处理过程中,我的应用程序在 ZXing 库的典型取景器中显示黑屏(我想你明白我的意思)。如何用另一个带有进度条的块替换这个视图?

我已经尝试在事件 onPreExecuteonPostExecute 上修改进度条的可见性,我还尝试使用事件 onProgressUpdate,但没有什么是改变。取景器会一直留在屏幕上,直到 asyncTask 未完成。 按照我的代码执行 AsyncTask:

response = asynkTaskDeleteMissionQueue.execute().get();

还有我的 AsyncTask 类

package com.klainrobotics.lucalombardi.krmir;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.util.List;
import java.util.Vector;

/**
 * Created by Luca Lombardi on 27/11/2017.
 */

public class MiRCall extends AsyncTask <String, Void, List<Object> >{
    public AsyncResponse delegate = null;

    private String url;
    private String method;
    private ProgressBar progress;

    public MiRCall(Context v, ProgressBar prg, String...params){
        method = params[0];
        url = params[1];
        progress = prg;
    }

    @Override
    protected void onPreExecute(){

    }

    @Override
    protected void onProgressUpdate(Void... v) {
        super.onProgressUpdate(v);

    }


    @Override
    protected List<Object> doInBackground(String... arg0) {
        int result = -1;
        publishProgress();

        List<Object> response = new Vector<Object>();
        String jsonResponse = "";

        BufferedReader br;

        try {
            URL urlMissionQueue = new URL(url);

            HttpURLConnection connection = (HttpURLConnection) urlMissionQueue.openConnection();
            if (connection != null) {
                connection.setRequestMethod(method);
                connection.setRequestProperty(Costanti.headers, Costanti.StringaHeader());
                connection.setRequestProperty(Costanti.contentType, Costanti.contentTypeJSon);
                customBody(connection);

                connection.connect();
                result = connection.getResponseCode();
                response.add(result);

                if (200 <= result && result <= 299) {
                    br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                } else {
                    br = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
                }

                for (String line; (line = br.readLine()) != null; jsonResponse += line);

                response.add(jsonResponse);

            }else {
                Log.e("Url", "Connection is null");
            }

        } catch (Exception ex) {
            Log.e("MiRCall", "doInBackgound: " + ex.toString());
        }

        return response;
    }

    @Override
    protected void onPostExecute(List<Object> result) {

        if (delegate != null) {
                delegate.processFinish(result);
        } else {
            Log.e("MiRCall", "You have not assigned AsyncTask delegate");
        }
    }

    public void customBody(HttpURLConnection connection) throws ProtocolException {
        // Do nothing
    }
}

提前致谢

【问题讨论】:

  • publishProgress() 是做什么的?您无法在 doInBackground() 函数中更新 ui 元素

标签: android android-asynctask zxing


【解决方案1】:
response = asynkTaskDeleteMissionQueue.execute().get();

在其上使用 .get() 函数非常糟糕。取消 get()。只启动任务。

asynkTaskDeleteMissionQueue.execute();

然后在 onPostExecute() 中处理响应。

【讨论】:

    【解决方案2】:

    感谢您的建议。我执行

    response = asynkTaskDeleteMissionQueue.execute().get();
    

    因为我的 asyncTask 返回一个对象列表,所以我不知道另一种方式....

    关于最初的问题?有什么建议吗?

    感谢您的宝贵时间

    【讨论】:

      猜你喜欢
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多