>

몇 초가 걸리는 dropbox에서 파일을 다운로드하고 있습니다. ProgressDialog 를 추가하고 싶습니다  다운로드 용이지만 그 방법을 모르겠습니다.

public class DownloadFile extends AsyncTask<Void, Long, Boolean> {
    DownloadFile(Context context ,DropboxAPI<?> mApi ,String dropboxpath,String   sdpath,int pos,int s,ArrayList<String> folder) throws DropboxException {
        FileOutputStream mFos;
        File file=new File(sdpath);
        String path = dropboxpath;
        try{
            mFos = new FileOutputStream(file);
            mApi.getFile(path, null, mFos, null);
        }catch (Exception e) {
            // TODO: handle exception
        }
    } 
    @Override
    protected Boolean doInBackground(Void... params) {
        // TODO Auto-generated method stub
        return null;
    }   
}

  • 답변 # 1

    이렇게하십시오 :

    public final class DownloadFile extends AsyncTask<Void, Long, Boolean> {
    private Context context;
    private ProgressDialog progressDialog;
    public DownloadFile (Context context) {
        this.context = context;
    }
    /* 
     * @see android.os.AsyncTask#onPreExecute()
     */
    @Override
    protected void onPreExecute() {
        try {
            progressDialog = ProgressDialog.show(context, "", "message", true);
        } catch (final Throwable th) {
            //TODO
        }
    }
    /* 
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected Boolean doInBackground(Void... arg0) {
        //do something
    }
        @Override
    protected void onProgressUpdate(String... progress) {
        //do something
        super.onProgressUpdate(progress);
    }
    /* 
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
    @Override
    protected void onPostExecute(Boolean result) {
        progressDialog.dismiss();
    } }
    
    

  • 답변 # 2

    이 간단한 코드 @sachin 사용

    public class DownloadFile extends AsyncTask<Void, Void, Void> {
        Home home;
        ProgressDialog dialog = null;
        public DownloadFile(Home home) {
            // TODO Auto-generated constructor stub
            this.home = home;
        }
        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            //Call hare method for download
            return null;
        }
        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
             dialog.dismiss();  
        }
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
             dialog = ProgressDialog.show(home, "Downloading......", "", true);
        }
    }
    
    

  • 답변 # 3

    이 기사는 다음에 유용합니다.

    http://huuah.com/android-progress-bar-and-thread-updating/

    스레드의 run () 메소드 안에 다음과 같은 함수를 호출 할 수 있습니다 :

    public boolean download(String url, String path, String fileName, Handler progressHandler) {
        try {
            URL sourceUrl = new URL(formatUrl(url));
            if (fileName == null || fileName.length() <= 0) {
                fileName = sourceUrl.getFile();
            }
            if (fileName == null || fileName.length() <= 0) {
                throw new Exception("EMPTY_FILENAME_NOT_ALLOWED");
            }
            File targetPath = new File(path);
            targetPath.mkdirs();
            if (!targetPath.exists()) {
                throw new Exception("MISSING_TARGET_PATH");
            }
            File file = new File(targetPath, fileName);
            URLConnection ucon = sourceUrl.openConnection();
            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            ByteArrayBuffer baf = new ByteArrayBuffer(100);
            int current = 0;
            int totalSize = ucon.getContentLength();
            while ((current = bis.read()) != -1) {
                baf.append((byte) current);
                // BEGIN - Handler feedback
                if (progressHandler != null && (baf.length() % 100) == 0) {
                    Message msg = progressHandler.obtainMessage();
                    Bundle b = new Bundle();
                    if (totalSize > 0) {
                        b.putInt("total", totalSize);
                        b.putInt("step", baf.length());
                        b.putBoolean("working", true);
                    }
                    msg.setData(b);
                    progressHandler.handleMessage(msg);
                }
                // END
            }
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(baf.toByteArray());
            fos.close();
            // BEGIN - Handler feedback
            if (progressHandler != null) {
                Message msg = progressHandler.obtainMessage();
                Bundle b = new Bundle();
                if (totalSize > 0) {
                    b.putInt("total", 0);
                    b.putInt("step", 0);
                    b.putBoolean("working", false);
                }
                msg.setData(b);
                progressHandler.handleMessage(msg);
            }
            // END
            return file.exists();
        }
    
    

    이렇게하면 다운로드의 실제 진행 상황 (바이트 당 바이트)에 대한보다 정확한 피드백이 있습니다.

  • 답변 # 4

    AsyncTask에는 실제로 4 가지 방법이 있습니다 :

    <올>

    onPreExecute()  -여기에서 사전 실행 작업을 수행 할 수 있습니다.

    doInBackground()  -여기에서 백그라운드 작업을 수행 할 수 있습니다.

    onPostExecute()  -여기서 사후 실행 작업을 수행 할 수 있습니다. ListView에 데이터 표시, TextView 업데이트 등과 같은 수단

    onProgressUpdate()  -백그라운드 작업이 진행되는 동안 UI를 업데이트하려면

    귀하의 경우 onPreExecute() 내부에 진행률 대화 상자 또는 진행률 표시 줄을 표시 할 수 있습니다  AsyncTask의 메소드와 onPostExecute() 에서 동일하게 dismiss (()) .

관련 자료

  • 이전 sql - 테이블, 필드 및 스키마 이름을 사용하여 참조 된 테이블 이름 찾기
  • 다음 php - iframe 내에서 Google 링크를 여는 방법은 무엇입니까?