多个asynctasks重用进度条

时间:2014-05-13 18:46:06

标签: android android-asynctask

我已经彻底完成了我的研究,没有实际结果所以我在这里。

我的应用程序中有一个水平ProgressBar,用于指示文件上传的进度。当我上传整个目录时,我试图让它显示当时上传的单个文件的进度。我使用带有FixedThreadPool(1)的asynctasks。问题是,只有第一个任务才会触发进度条。

主要活动中的方法:

uploadExecutor = Executors.newFixedThreadPool(1);
private void upload() throws DropboxException, IOException {
                if(isDir){
                    DataDir dir = new DataDir(file);
                    List<File> files = dir.getFileList();

                    for(File item : files){
                        Upload upload = new Upload(getActivity(), dropbox, "/Apps/Sink/", item, bar);
                        upload.executeOnExecutor(uploadExecutor);
                    }
                }
                else {
                    Upload upload = new Upload(getActivity(), dropbox, "/Apps/Sink/", file, bar);
                    upload.executeOnExecutor(uploadExecutor);
                }
            }

Upload是一个实现AsyncTask并处理文件上传的类。

创建时,类的实例将条形设置为可见,并在OnPostExecute()中将其设置为不可见


修改

添加上传课程。

 public Upload(Context context, DropboxAPI<?> api, String dropboxPath,
                  File file, ProgressBar mBar) {

    this.mBar = mBar;
    mBar.setProgress(0);
    mBar.setVisibility(View.VISIBLE)

@Override protected Boolean doInBackground(Void... params){
    try {
        // By creating a request, we get a handle to the putFile operation,
        // so we can cancel it later if we want to
        FileInputStream fis = new FileInputStream(mFile);
        String path = mPath + mFile.getName();
        mRequest = mApi.putFileOverwriteRequest(path, fis, mFile.length(),
                new ProgressListener() {
                    @Override
                    public long progressInterval() {
                        // Update the progress bar every half-second or so
                        return 500;
                    }

                    @Override
                    public void onProgress(long bytes, long total) {
                        publishProgress(bytes);
                    }
                });

        if (mRequest != null) {
            mRequest.upload();
            return true;
        }


@Override
protected void onProgressUpdate(Long... progress) {
    int percent = (int)(100.0*(double)progress[0]/mFileLen + 0.5);
    //mDialog.setProgress(percent);
    mBar.setProgress(percent);
}

@Override
protected void onPostExecute(Boolean result) {
    if (result) {
        showToast("File successfully uploaded");
    } else {
        showToast(mErrorMsg);
    }
    mBar.setVisibility(View.INVISIBLE);
}

修改

我通过将for循环移动到上传类来解决了这个问题。 非常相似的方法HERE

2 个答案:

答案 0 :(得分:1)

在您的上传课程中,您可以实施AsynkTak检查进度状态更改的方法

protected void onProgressUpdate(整数......进度){/ 您的代码 /}

http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)

答案 1 :(得分:1)

您遇到的问题是您为每个文件初始化一个AsyncTask,并为每个文件提供对同一ProgressBar的引用。

当您循环访问文件并初始化AsyncTasks时,会发生什么。现在,如果第一个任务完成,则栏将被设置为不可见。以下任务无法使用您当前的设置再次显示它。

您可以尝试在AsyncTask的onPostExecute()中设置栏,因为在doInBackground()开始之前会调用此栏。或者您可以在doInBackground()的开头触发onProgreesUpdate()让它在那里可见。