studio - onpreexecute method in android
asynctask android carga mĂșltiples archivos a Dropbox (2)
Me gustaría subir varios archivos de mi SD a una carpeta de Dropbox. pero la pregunta no es sobre el problema del dropbox:
Tengo una matriz de archivos y me gustaría subir los archivos uno por uno, NO TODOS al mismo tiempo.
la carga funciona bien, ya que realizo un bucle for a través de File Array, pero se llevan a cabo simultáneamente.
Me gustaría dar información sobre el progreso del diálogo sobre el tamaño total y el número de archivos
¿alguna sugerencia?
Gracias,
Paso de myClass:
Log.i("toBeUploaded",
" " + Arrays.toString(toBeUploaded));
for (int i = 0; i < toBeUploaded.length; i++) {
Upload upload = new Upload(CalcDBActivity.this,
mDBApi, getIntent().getExtras()
.getString("project")
+ File.separatorChar,
toBeUploaded[i]);
upload.execute();
if (upload.getStatus() == Upload.Status.PENDING) {
// My AsyncTask has not started yet
Log.i("Status pend",
" " + upload.getStatus());
}
if (upload.getStatus() == Upload.Status.RUNNING) {
// My AsyncTask is currently doing work in
// doInBackground()
Log.i("Status run ",
" " + upload.getStatus());
}
if (upload.getStatus() == Upload.Status.FINISHED) {
Log.i("Status Finished",
" " + upload.getStatus());
// My AsyncTask is done and onPostExecute
// was called
}
}
donde "toBeUploaded" es la matriz de archivos.
la clase de carga:
public class Upload extends AsyncTask<Void, Long, Boolean> {
private DropboxAPI<?> mApi;
private String mPath;
private File mFile;
private long mFileLen;
private UploadRequest mRequest;
private Context mContext;
private final ProgressDialog mDialog;
private String mErrorMsg;
public Upload(Context context, DropboxAPI<?> api, String dropboxPath,
File file) {
// We set the context this way so we don''t accidentally leak activities
mContext = context.getApplicationContext();
mFileLen = file.length();
mApi = api;
mPath = dropboxPath;
mFile = file;
mDialog = new ProgressDialog(context);
mDialog.setMax(100);
mDialog.setMessage("Uploading " + file.getName());
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setProgress(0);
mDialog.setButton("Cancel", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// This will cancel the putFile operation
mRequest.abort();
}
});
mDialog.show();
}
@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;
}
} catch (DropboxUnlinkedException e) {
// This session wasn''t authenticated properly or user unlinked
mErrorMsg = "This app wasn''t authenticated properly.";
} catch (DropboxFileSizeException e) {
// File size too big to upload via the API
mErrorMsg = "This file is too big to upload";
} catch (DropboxPartialFileException e) {
// We canceled the operation
mErrorMsg = "Upload canceled";
} catch (DropboxServerException e) {
// Server-side exception. These are examples of what could happen,
// but we don''t do anything special with them here.
if (e.error == DropboxServerException._401_UNAUTHORIZED) {
// Unauthorized, so we should unlink them. You may want to
// automatically log the user out in this case.
} else if (e.error == DropboxServerException._403_FORBIDDEN) {
// Not allowed to access this
} else if (e.error == DropboxServerException._404_NOT_FOUND) {
// path not found (or if it was the thumbnail, can''t be
// thumbnailed)
} else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) {
// user is over quota
} else {
// Something else
}
// This gets the Dropbox error, translated into the user''s language
mErrorMsg = e.body.userError;
if (mErrorMsg == null) {
mErrorMsg = e.body.error;
}
} catch (DropboxIOException e) {
// Happens all the time, probably want to retry automatically.
mErrorMsg = "Network error. Try again.";
} catch (DropboxParseException e) {
// Probably due to Dropbox server restarting, should retry
mErrorMsg = "Dropbox error. Try again.";
} catch (DropboxException e) {
// Unknown error
mErrorMsg = "Unknown error. Try again.";
} catch (FileNotFoundException e) {
}
return false;
}
@Override
protected void onProgressUpdate(Long... progress) {
int percent = (int)(100.0*(double)progress[0]/mFileLen + 0.5);
mDialog.setProgress(percent);
}
@Override
protected void onPostExecute(Boolean result) {
mDialog.dismiss();
if (result) {
showToast("Image successfully uploaded");
} else {
showToast(mErrorMsg);
}
}
private void showToast(String msg) {
Toast error = Toast.makeText(mContext, msg, Toast.LENGTH_LONG);
error.show();
}
}
Con la ayuda de Daverix, logré llegar a una solución. Publiqué el código a continuación, solo en caso de que alguien tenga el mismo problema con las barras de progreso.
Cambié el nombre de algunas variables en comparación con las versiones anteriores:
public class Upload extends AsyncTask<Void, Long, Boolean> {
private DropboxAPI<?> mApi;
private String mPath;
private UploadRequest mRequest;
private Context mContext;
private ProgressDialog mDialog;
private String mErrorMsg,filename;
// new class variables:
private int mFilesUploaded;
private File[] mFilesToUpload;
private int mCurrentFileIndex;
int totalBytes = 0, indBytes = 0;
public Upload(Context context, DropboxAPI<?> api, String dropboxPath,
File[] filesToUpload) {
// We set the context this way so we don''t accidentally leak activities
mContext = context.getApplicationContext();
mApi = api;
mPath = dropboxPath;
// set number of files uploaded to zero.
mFilesUploaded = 0;
mFilesToUpload = filesToUpload;
mCurrentFileIndex = 0;
for (int i = 0; i < mFilesToUpload.length; i++) {
Long bytes = mFilesToUpload[i].length();
totalBytes += bytes;
}
mDialog = new ProgressDialog(context);
mDialog.setMax(100);
mDialog.setMessage("Uploading file 1 / " + filesToUpload.length);
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setProgress(0);
mDialog.setButton("Cancel", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
cancel(true);
}
});
mDialog.show();
}
@Override
protected Boolean doInBackground(Void... params) {
try {
for (int i = 0; i < mFilesToUpload.length; i++) {
mCurrentFileIndex = i;
File file = mFilesToUpload[i];
int bytes = (int) mFilesToUpload[i].length();
indBytes = bytes;
filename= mFilesToUpload[i].getName();
// 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(file);
String path = mPath + file.getName();
mRequest = mApi.putFileOverwriteRequest(path, fis,
file.length(), new ProgressListener() {
@Override
public long progressInterval() {
// Update the progress bar every half-second or
// so
return 100;
}
@Override
public void onProgress(long bytes, long total) {
if (isCancelled()) {
// This will cancel the putFile operation
mRequest.abort();
} else {
publishProgress(bytes);
}
}
});
mRequest.upload();
if (!isCancelled()) {
mFilesUploaded++;
} else {
return false;
}
}
return true;
} catch (DropboxUnlinkedException e) {
// This session wasn''t authenticated properly or user unlinked
mErrorMsg = "This app wasn''t authenticated properly.";
} catch (DropboxFileSizeException e) {
// File size too big to upload via the API
mErrorMsg = "This file is too big to upload";
} catch (DropboxPartialFileException e) {
// We canceled the operation
mErrorMsg = "Upload canceled";
} catch (DropboxServerException e) {
// Server-side exception. These are examples of what could happen,
// but we don''t do anything special with them here.
if (e.error == DropboxServerException._401_UNAUTHORIZED) {
// Unauthorized, so we should unlink them. You may want to
// automatically log the user out in this case.
} else if (e.error == DropboxServerException._403_FORBIDDEN) {
// Not allowed to access this
} else if (e.error == DropboxServerException._404_NOT_FOUND) {
// path not found (or if it was the thumbnail, can''t be
// thumbnailed)
} else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) {
// user is over quota
} else {
// Something else
}
// This gets the Dropbox error, translated into the user''s language
mErrorMsg = e.body.userError;
if (mErrorMsg == null) {
mErrorMsg = e.body.error;
}
} catch (DropboxIOException e) {
// Happens all the time, probably want to retry automatically.
mErrorMsg = "Network error. Try again.";
} catch (DropboxParseException e) {
// Probably due to Dropbox server restarting, should retry
mErrorMsg = "Dropbox error. Try again.";
} catch (DropboxException e) {
// Unknown error
mErrorMsg = "Unknown error. Try again.";
} catch (FileNotFoundException e) {
}
return false;
}
@Override
protected void onProgressUpdate(Long... progress) {
mDialog.setMessage("Uploading file " + (mCurrentFileIndex + 1) + " / "
+ mFilesToUpload.length+"/n"+filename);
int percent = (int) (100.0 * (double) progress[0] / indBytes + 0.5);
Log.i("pro", percent + " " + progress[0] + "/" + indBytes);
mDialog.setProgress(percent);
}
@Override
protected void onPostExecute(Boolean result) {
mDialog.dismiss();
if (result) {
showToast("Upload finished");
} else {
showToast(mErrorMsg);
}
}
private void showToast(String msg) {
Toast error = Toast.makeText(mContext, msg, Toast.LENGTH_LONG);
error.show();
}
}
Mueva el for-loop en la clase principal:
Log.i("toBeUploaded", " " + Arrays.toString(toBeUploaded));
Upload upload = new Upload(CalcDBActivity.this,
mDBApi,
getIntent().getExtras().getString("project") + File.separatorChar,
toBeUploaded);
upload.execute();
en la clase de carga:
public class Upload extends AsyncTask<Void, Long, Boolean> {
private DropboxAPI<?> mApi;
private String mPath;
private UploadRequest mRequest;
private Context mContext;
private ProgressDialog mDialog;
private String mErrorMsg;
//new class variables:
private int mFilesUploaded;
private File[] mFilesToUpload;
private int mCurrentFileIndex;
public Upload(Context context, DropboxAPI<?> api, String dropboxPath, File[] filesToUpload) {
// We set the context this way so we don''t accidentally leak activities
mContext = context.getApplicationContext();
mApi = api;
mPath = dropboxPath;
//set number of files uploaded to zero.
mFilesUploaded = 0;
mFilesToUpload = filesToUpload;
mCurrentFileIndex = 0;
mDialog = new ProgressDialog(context);
mDialog.setMax(100);
mDialog.setMessage("Uploading file 1 / " + filesToUpload.length);
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setProgress(0);
mDialog.setButton("Cancel", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
cancel(true);
}
});
mDialog.show();
}
@Override
protected Boolean doInBackground(Void... params) {
try {
for (int i = 0; i < mToBeUploaded.length; i++) {
mCurrentFileIndex = i;
File file = mToBeUploaded[i];
// 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(file);
String path = mPath + file.getName();
mRequest = mApi.putFileOverwriteRequest(path, fis, file.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) {
if(isCancelled()) {
// This will cancel the putFile operation
mRequest.abort();
}
else {
publishProgress(bytes);
}
}
});
mRequest.upload();
if(!isCancelled) {
mFilesUploaded++;
}
else {
return false;
}
}
return true;
} catch (DropboxUnlinkedException e) {
// This session wasn''t authenticated properly or user unlinked
mErrorMsg = "This app wasn''t authenticated properly.";
} catch (DropboxFileSizeException e) {
// File size too big to upload via the API
mErrorMsg = "This file is too big to upload";
} catch (DropboxPartialFileException e) {
// We canceled the operation
mErrorMsg = "Upload canceled";
} catch (DropboxServerException e) {
// Server-side exception. These are examples of what could happen,
// but we don''t do anything special with them here.
if (e.error == DropboxServerException._401_UNAUTHORIZED) {
// Unauthorized, so we should unlink them. You may want to
// automatically log the user out in this case.
} else if (e.error == DropboxServerException._403_FORBIDDEN) {
// Not allowed to access this
} else if (e.error == DropboxServerException._404_NOT_FOUND) {
// path not found (or if it was the thumbnail, can''t be
// thumbnailed)
} else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) {
// user is over quota
} else {
// Something else
}
// This gets the Dropbox error, translated into the user''s language
mErrorMsg = e.body.userError;
if (mErrorMsg == null) {
mErrorMsg = e.body.error;
}
} catch (DropboxIOException e) {
// Happens all the time, probably want to retry automatically.
mErrorMsg = "Network error. Try again.";
} catch (DropboxParseException e) {
// Probably due to Dropbox server restarting, should retry
mErrorMsg = "Dropbox error. Try again.";
} catch (DropboxException e) {
// Unknown error
mErrorMsg = "Unknown error. Try again.";
} catch (FileNotFoundException e) {
}
return false;
}
@Override
protected void onProgressUpdate(Long... progress) {
Long totalBytes = 0;
Long bytesUploaded = 0;
for(int i=0;i<mFilesToUpload.length;i++) {
Long bytes = mFilesToUpload[i].length()
totalBytes += bytes;
if(i < mCurrentFileIndex) {
bytesUploaded += bytes;
}
}
bytesUploaded += progress[0];
mDialog.setMessage("Uploading file " + (mCurrentFileIndex+1) + " / " + filesToUpload.length);
mDialog.setProgress((bytesUploaded / totalBytes) * 100);
}
@Override
protected void onPostExecute(Boolean result) {
mDialog.dismiss();
if (result) {
showToast("Image successfully uploaded");
} else {
showToast(mErrorMsg);
}
}
private void showToast(String msg) {
Toast error = Toast.makeText(mContext, msg, Toast.LENGTH_LONG);
error.show();
}
}