1

Android を学習するために、小さなアプリを作成しています。私が最初にやろうとしているのは、リモート API 経由でログインすることです。

通話が行われているときに「読み込み中」ダイアログを表示したいと思います(ユーザーがモバイルインターネットを使用している場合)。これを調査すると、2 つの可能な方法が示されました。

1 つはProgressDialogとThreadを拡張するプライベート クラスを使用する方法で、もう 1 つはAsyncTaskを拡張するプライベート クラスを使用する方法です。

このタスクに最適/より適切なのはどれですか?

ProgressDialog バージョンを使用してみましたが、苦労しています。HTTP リクエストを作成する関数を拡張 Thread run() メソッドに配置しましたが、応答データ (JSON) をアクティビティに戻す方法がわかりません。

感謝して受け取ったすべての助け。

4

2 に答える 2

2

可能な最善の方法は、AsyncTaskを とともに使用することProgressDialogです。AsyncTask必要なすべてのメソッドを拡張して実装する必要があります。

  • onPreExecute()- ここで、あなたProgressDialogshow()それを初期化します
  • doInBackground()-ここであなたの仕事をします
  • onPostExecute()-ここであなたはそれを隠すようにdismiss()呼びかけますProgressDialog
  • (オプション) onProgressUpdate()- ここで、進行状況がProgressDialog確定している場合に変更できます

クラスには、作業の結果を取得できるget()メソッドがあります。また、と の呼び出しAsyncTaskの間にインターフェースを実装して、結果を返すこともできます。お役に立てれば。AsyncTaskActivity

于 2012-07-13T14:20:07.557 に答える
0

努力には報いが伴います :) Egor の言う通り、AsyncTask はそれを行うための最良の方法です。ただし、アクティビティは UI スレッドで動作し、スレッドでは動作していないことを知っておく必要があります。したがって、物事を共有する唯一の方法は、ハンドラーを使用することです。ここに例があります:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);         
    setContentView(R.layout.main);      
    progress = (ProgressBar) findViewById(R.id.progressBar1);       
    handler= new Handler();     
}

public void startProgress(View view) {
    // Do something long
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                final int value = i;
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        progress.setProgress(value);
                    }
                });
            }
        }
    };
    new Thread(runnable).start();
}
于 2012-07-13T14:30:17.500 に答える