我已经彻底完成了我的研究,没有实际结果所以我在这里。
我的应用程序中有一个水平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
答案 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()让它在那里可见。