Android Progressbar при использовании WCF - PullRequest
0 голосов
/ 12 июля 2011

Я написал индикатор выполнения, когда использую часть WCF.Я должен знать, после получения ответа его нужно отклонить.

   ProgressThread progThread;
   ProgressDialog progDialog;
   int typeBar;                     // Determines type progress bar: 0 = spinner, 1 = horizontal
   int delay = 40;                  // manually define thedelay
   int maxBarValue = 200;           // manually define the maximum value 

   @Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case 0:
        typeBar = 0;
        showDialog(typeBar);
        return true;
    case 1:
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
protected Dialog onCreateDialog(int id) {
    // Spinner
    progDialog = new ProgressDialog(this);
    progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progDialog.setMessage("Loading...");
    progThread = new ProgressThread(handler);
    progThread.start();
    return progDialog;

}

 final Handler handler = new Handler() {
     public void handleMessage(Message msg) {

         int total = msg.getData().getInt("total");
         progDialog.setProgress(total);
         if (total <= 0){
             dismissDialog(typeBar);
             progThread.setState(ProgressThread.DONE);
         }
     }
 };

Это класс потока

   private class ProgressThread extends Thread {    
    final static int DONE = 0;
    final static int RUNNING = 1;
    Handler mHandler;
    int mState;
    int total;

    ProgressThread(Handler h) {
        mHandler = h;
    }

    @Override
    public void run() {
        mState = RUNNING;   
        total = maxBarValue;
        while (mState == RUNNING) {
            try {
                loadDownloadData();
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                Log.e("ERROR", "Thread was Interrupted");
            }

            Message msg = mHandler.obtainMessage();
            Bundle b = new Bundle();
            b.putInt("total", total);
            msg.setData(b);
            mHandler.sendMessage(msg);

            total--;   
        }
    }

    public void setState(int state) {
        mState = state;
    }
}

Метод вызова WCF равен loadDownloadData (); , гдехотите позвонить и как мы можем определить временные рамки для сна, после получения ответа нужно только закрыть этот индикатор ...

Пожалуйста, помогите мне

Заранее спасибо.

1 Ответ

0 голосов
/ 12 июля 2011

Что именно должен делать ваш метод?

На данный момент похоже, что вы вызываете какой-то метод в цикле, и после этого вы спите потоком. Если ваш loadDownloadData вызывает WCF, он будет вызываться в каждом цикле? Если он не запускает асинхронную обработку, он будет ждать завершения метода и только после этого продолжит спать поток.

Если вы хотите иметь индикатор выполнения для загрузки контента через WCF, вы не можете использовать такой подход. Сначала весь вызов WCF должен выполняться асинхронно. Далее вам нужно заранее знать количество загруженных данных и вам нужно постоянно читать данные - только это позволит вам контролировать реальный индикатор выполнения. Обычная обработка HTTP записывает все данные на сервер, передает их в сеть, загружает все данные в буфер на клиенте и после этого ваш метод возвращает результат - из клиентского API такая операция является атомарной (= вы не можете измерить прогресс). Этого обычно избегают с помощью фрагментированных данных, когда сервер помещает данные в фрагменты, и клиент может читать эти фрагменты как поток. В WCF это выполняется в режиме потоковой передачи.

В данный момент вы должны просто использовать неограниченный счетчик и дождаться завершения операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...