2011-07-12 5 views
0

WCFの部分を消費するときに進行状況バーを書きました。私は応答を得た後、それを却下する必要があることを知る必要があります。WCFを消費するときのAndroid Progressbar

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(あるスレッドのクラスです。我々は唯一のそれは、このプログレスバーをdismisする必要が応答を取得した後、睡眠のための時間枠を定義する方法&を呼び出したい、...

は、事前に私に

感謝を助けてください。

答えて

0

どのようにすればよいですか?

現時点では、ループでいくつかのメソッドを呼び出しているように見えますが、その後はスレッドをスリープします。 loadDownloadDataがWCFを呼び出す場合、各サイクルで呼び出されますか?非同期処理を開始しない場合、メソッドが完了するまで待機し、その後はスレッドをスリープ状態にします。

WCF経由でコンテンツをダウンロードするためのプログレスバーが必要な場合は、このような方法を使用することはできません。まず、WCF呼び出し全体を非同期に実行する必要があります。次にダウンロードしたデータの量を知る必要があり、データを連続して読み取る必要があります。その場合にのみ、実際の進行状況バーを制御できます。通常のHTTP処理は、すべてのデータをサーバーに書き込み、ネットワークに渡し、クライアント上のバッファにすべてのデータをロードします。その後、クライアントAPIから結果を返します。このような操作はアトミックです(=進行状況を測定することはできません)。これは通常、サーバーがデータをチャンクでプッシュし、クライアントがストリームのようにこれらのチャンクを読み取るチャンクされたデータによって回避されます。 WCFでは、ストリーミング転送モードで実行されます。

現在のところ、無制限のスピナーを使用して操作が完了するまで待つだけです。

+0

実際に私はsq-liteとSQLサーバを同期させています。その状況では、私はWCFからAndroidにデータのチャンクをダウンロードしたいと思っています。バックエンドクライアントは、そのプロセスが完了するまで待つためのプログレスバーを表示する必要があります。あなたの提案から、私はloadDownloadData()mtdを同期させるべきです。私は本当に私が同期を使用する場合は、理解していないMutipleユーザアクセス。それらのユーザーは待つ必要がありますか?それとも各ユーザーのスレッドが広がっていますか? plsは私を助けます。 – Piraba

+0

これは複数のユーザーについてではありません。シングルユーザーがシングルアンドロイドアプリケーションを使用して、データをダウンロードしてプログレスバーを表示したい場合。 'loadDownloadData'がブロックしている場合、あなたのスレッドスリープは意味をなさない。 –

関連する問題