Как обновить индикатор выполнения в строке состояния, когда загрузка файла происходит с использованием Сервиса? - PullRequest
0 голосов
/ 03 ноября 2011

Я исследовал это и не нашел четкого ответа, который имеет комбинацию индикатора выполнения + строки состояния + Сервис? Моя проблема заключается в том, что способ загрузки файлов реализован (это единственный способ, поскольку сервер поддерживает его таким образом), я не могу отслеживать количество записываемых байтов. Следовательно, я не могу увеличить индикатор выполнения правильно, чтобы отразить точное состояние загрузки файла. Текущая реализация увеличивает индикатор выполнения, выполняет загрузку и удаляет индикатор выполнения, как только он достигает 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)

1 Ответ

0 голосов
/ 16 ноября 2011

Я нашел решение этой проблемы. Это не идеальное решение, но из-за того, что подсчет байтов невозможен, я прибег к этому маршруту. В сервисе загрузки, который я создал, у меня есть 2 разных потока. Поток № 1 выполняет загрузку, а поток № 2 поддерживает индикатор выполнения в области уведомлений. Тема # 2 зависит от # 1. Пока № 1 активен, поток № 2 увеличивается на 1 и спит 1 с, а с каждым шагом выполнения интервал ожидания увеличивается на 0,2 с. Если загрузка завершается, скажем, на 45%, индикатор выполнения переходит на 100%.

...