Я исследовал это и не нашел четкого ответа, который имеет комбинацию индикатора выполнения + строки состояния + Сервис? Моя проблема заключается в том, что способ загрузки файлов реализован (это единственный способ, поскольку сервер поддерживает его таким образом), я не могу отслеживать количество записываемых байтов. Следовательно, я не могу увеличить индикатор выполнения правильно, чтобы отразить точное состояние загрузки файла.
Текущая реализация увеличивает индикатор выполнения, выполняет загрузку и удаляет индикатор выполнения, как только он достигает 100. НО этот прогресс не является точным отражением загрузки. Загрузка происходит намного раньше, но панель остается включенной. Я предпочел бы иметь прогресс, показывающий, когда этот запрос / ответ происходит.
Ниже приведен мой фрагмент кода:
public class UploadFileService extends IntentService {
public UploadFileService() {
super("UploadFileService");
}
@Override
protected void onHandleIntent(Intent intent) {
fName = intent.getExtras().getString(Constants.EXTRA_K_FILENAME);
path = intent.getExtras().getString(Constants.EXTRA_K_FILEPATH);
attribute = intent.getExtras().getString(Constants.EXTRA_K_ATTRIBUTE);
//Start thread to doFilepUpload
uploadthread = new UploadThread(fName, path, attribute);
uploadthread.start();
}
// Определяем обработчик, который получает сообщения из потока и обновляет прогресс
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
Integer total = msg.arg1;
notification.contentView.setProgressBar(R.id.status_progress, 100, total, false);
nm.notify(NOTIFICATION_ID, notification);
if ( total.equals(100) && getResponse() != null ){
// inform the progress bar of updates in progress
uploadthread.setState(UploadThread.STATE_DONE);
Intent broadcastIntent = prepareBroadcast();
// remove the notification (we're done)
nm.cancel(NOTIFICATION_ID);
sendBroadcast(broadcastIntent);
}
}
};
public class UploadThread extends Thread {
private String name;
private String path;
private String attribute;
final static int STATE_DONE = 0;
final static int STATE_RUNNING = 1;
int mState;
int total;
public UploadThread(String fName, String path, String attribute) {
// TODO Auto-generated constructor stub
this.name = fName;
this.path = path;
this.attribute = attribute;
}
@Override
public void run() {
// TODO Auto-generated method stub
setResponse(doFileUpload(name, path, attribute));
if( getResponse() != null){
// house keeping for the application
if(response.result.equalsIgnoreCase("success")){
saveFileName = response.data.savedFileName;
responseMessage = response.message;
}else if (response.result.equalsIgnoreCase("error") ||
response == null ){
responseMessage = response.message;
saveFileName = null;
originalName = fName;
}
}
mState = STATE_RUNNING;
total = 0;
while (mState == STATE_RUNNING && total <=100) {
try {
Log.d(TAG, "^^ Thread.sleep");
Thread.sleep(1000);
} catch (InterruptedException e) {
Logger.e("ERROR", "Thread Interrupted");
}
Message msg = handler.obtainMessage();
msg.arg1 = total;
handler.sendMessage(msg);
total++;
}
}
/* sets the current state for the thread,
* used to stop the thread */
public void setState(int state) {
mState = state;
}
}
У кого-нибудь есть предложения / идеи о том, как я могу обновить индикатор выполнения, чтобы показать правильный процесс загрузки?
Процесс загрузки файла:
paramString = p.getName()+"="+URLEncoder.encode(p.getValue(), HTTP.UTF_8);
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "unsupported encoding -->
name="+p.getName()+"; value="+p.getValue(), e);
throw e;
}
if (combinedParams.length() > 1) {
combinedParams += "&" + paramString;
} else {
combinedParams += paramString;
}
}
}
request = new HttpPost(url + combinedParams);
MultipartEntity entity = new MultipartEntity();
// add headers
for (NameValuePair h : headers) {
request.addHeader(h.getName(), h.getValue());
}
// add cookies
for(NameValuePair c : cookies) {
request.addHeader(H_COOKIE,
c.getName()+"="+c.getValue());
}
entity.addPart(uploadFile.getName(), new FileBody(uploadFile));
request.setEntity(entity)