2017-12-11 3 views
0

순차적으로 호출되는 3 개 이상의 AsycTask가있는 응용 프로그램이 있습니다. 이러한 asyntasks는 모두 비슷하기 때문에 분리 된 클래스를 만들고 제대로 작동합니다.진행 막대가있는 AsyncTask

이제 asynctasks가 결과를 묻고 처리 할 때 뭔가를 표시하기 위해 진행 표시 줄을 추가하고 싶습니다.하지만 작동하지 않습니다. 다음과 같은

내 응용 프로그램 작업 :

  1. 내 카메라를 열고 ZXing 라이브러리와 나는 QRCODE
  2. 사용 HttpRequest를 내 서버에 몇 가지 정보를 요청을 디코딩하고 내 응용 프로그램이 정보를 처리

요점은 처리하는 동안 내 응용 프로그램이 ZXing 라이브러리의 팁 뷰 파인더가있는 검은 색 화면을 표시한다는 것입니다. (제 말의 의미를 이해한다고 생각합니다). 이 뷰를 진행 막대가있는 다른 블록으로 대체하는 방법은 무엇입니까?

이미 또한 내가 이벤트 onProgressUpdate를 사용하려고 onPreExecuteonPostExecute 이벤트에서, 수정 된 진행률 표시 줄 가시성했지만, nothig은 변화이다. 뷰 파인더는 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 
 
    } 
 
}

감사를

+0

publishProgress()는 무엇을합니까? doInBackground() 함수에서 UI 요소를 업데이트 할 수 없습니다. –

답변

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

갔지를 사용하는 아주 나쁜() 함수를 호출합니다. get()을 사용하지 마십시오. 작업 만 시작하십시오.

asynkTaskDeleteMissionQueue.execute(); 

그런 다음 onPostExecute()에서 응답을 처리합니다.

0

의견을 보내 주셔서 감사합니다. 나는

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

내 AsyncTask를이 객체의 목록을 반환하기 때문에

을 실행, 그래서 다른 방법 ....

그리고 원래의 질문에 대해 몰라? 어떤 제안?

어쨌든 시간 내 주셔서 감사합니다.

관련 문제