带进度条的AsyncTask

时间:2017-12-11 16:24:13

标签: android android-asynctask zxing

我有一个具有3个或更多AsycTask的应用程序,它们被顺序调用。因为这些asyntasks都是相似的,所以我创建了一个独立的类,它可以正常工作。

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

我的申请工作如下:

  1. 我打开相机并使用ZXing库解码qrCode
  2. 使用HttpRequest我向我的服务器询问一些信息,我的应用程序处理这些信息
  3. 重点是在处理过程中我的应用程序显示了一个带有ZXing库的典型取景器的黑屏(我想你明白我的意思)。如何使用进度条将此视图替换为另一个块?

    我已尝试修改事件 onPreExecute onPostExecute 上的进度条可见性,同时我尝试使用事件 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
        }
    }

    提前致谢

2 个答案:

答案 0 :(得分:0)

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

使用.get()函数非常糟糕。取消get()。只开始任务。

asynkTaskDeleteMissionQueue.execute();

然后在onPostExecute()处理响应。

答案 1 :(得分:0)

感谢您的建议。我执行

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

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

关于原始问题?有什么建议吗?

非常感谢您的时间