2016-09-15 9 views
2

ネットワークコール中に水平プログレスバーを更新しようとしています。私がネットワークコールを行うために使用しているAPIは、onSuccessとonFailureをコールバックするだけです。終わりには約0.5〜3秒かかります。ネットワークコール中にプログレスバーを更新する

私の問題は、私は私のUIを更新するか、それはdoesnのAsyncTask

+0

、。理想的には、より良いAPIを使用してください。 FWIW、OkHttp3の進捗状況の更新を示す(こちらのサンプルアプリケーションはこちら)(https://github.com/commonsguy/cw-omnibus/tree/master/HTTP/OkHttpProgress)。他のAPIを使用している – CommonsWare

+0

は私の選択肢ではありません。そのバーを埋めるには何らかの方法が必要です。進捗状況を正確に表現する必要はありません。ユーザーに何か起こっているUIフィードバックを与えるためにそれを記入できる場合にのみ、それは私には十分であるはずです。 – nitinsh99

+0

不確定な 'ProgressBar'はどうですか? –

答えて

1

の私のdoInBackgropund実装内部の私はpublishProgress内側を通るん()メソッド具体的には、このようなネットワーキング・コールの進行状況を定量化するか、どのようにあります進行状況を正確に表現する必要があります。ユーザーに何か起こっているUIフィードバックを与えるためにそれを記入できる場合にのみ、それは私には十分であるはずです。

個人的には、私はまだ不確定の進行状況インジケータを使用します。ユーザーは、アプリ開発者からBSを検出することにかなり精通しています。

言われているように、one of Zeno's paradoxesのバリエーションを使用することができます:500msごとに、残りの作業の割合を半分にカットします。そう:時間インデックス0で

  • 、0%(100%残存)時間インデックス500ミリ秒で
  • は、50%(50%が残っている)の進行状況を示すように進捗を示す
  • 時間インデックス1000ミリ秒で、ショー75%のように進行作業が行われ
  • などまで(12.5%残り)87.5%と進行状況を表示、時間インデックス1500msで
  • (25%が残っている)

あなたは更新を微調整する必要がある場合がありますfr均等とカットする量。しかし、基本的には、APIの処理が完了するまで、作業全体を通して段階的な進歩を見せています。直線的な進行(例えば、500msごとに10%)ではなく、このアルゴリズムで決してになることが保証されているので、進歩の余地は常にあります。確かに、あなたは最終的には定期的な作業を行うには

:-) ... ProgressBarにサブピクセルの調整に入ることは余分なスレッドを必要としないので、最も簡単な方法は、postDelayed()「ループ」である:

/*** 
    Copyright (c) 2012 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
    https://commonsware.com/Android 
*/ 

package com.commonsware.android.post; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Toast; 

public class PostDelayedDemo extends Activity implements Runnable { 
    private static final int PERIOD=5000; 
    private View root=null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    root=findViewById(android.R.id.content); 
    } 

    @Override 
    public void onResume() { 
    super.onResume(); 

    run(); 
    } 

    @Override 
    public void onPause() { 
    root.removeCallbacks(this); 

    super.onPause(); 
    } 

    @Override 
    public void run() { 
    Toast.makeText(PostDelayedDemo.this, "Who-hoo!", Toast.LENGTH_SHORT) 
     .show(); 
    root.postDelayed(this, PERIOD); 
    } 
} 
あなたのAPIを使用して、進捗情報を得られない場合、あなたは進捗情報を表示することはできませんまあ ( this sample appから、そして私の期間はご使用の場合には長すぎるである、5000msであることに注意してください)

関連する問題