1

いくつかの方法でメインアクティビティがあります。

  • GetTopics:REST APIを呼び出し、JSONの結果を返します
  • BindTopics:GetTopicsの結果を画面に表示します

同様の機能を備えたものは他にもいくつかありますが、すべての方法でこれらのソリューションに適合できると確信しています。

質問:これらを別々のスレッドで実行する適切な方法は何ですか?それらの両方が同じスレッドにある必要がありますか?GetTopicsが完了したら、BindTopicsを呼び出す必要がありますか?

いずれにせよ、非同期スレッドが完了する前にUIが構築されませんか?その場合、UIを更新するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

4 に答える 4

3

あなたのすべての質問への答えはAsyncTask

于 2012-04-24T14:23:12.813 に答える
1

UIを(ある種のロード画面で)作成してから、AsyncTaskを開始してデータをダウンロードして表示します。

AsyncTasksに関する基本的なブログ投稿がここにあります:http://android-developers.blogspot.co.uk/2009/05/painless-threading.html

AsyncTasks doInBackgroundメソッドでは、GetTopicsを呼び出します。次に、onPostExecuteメソッドで、BindTopicsを呼び出してデータを表示します。onPostExecuteメソッドでは、データを表示する前に、データが正しくダウンロードされたかどうかを確認できます。

于 2012-04-24T14:25:11.690 に答える
1

AsyncTaskを使用して進行状況ダイアログにロードします。UIスレッドのコントロールを更新するには、ハンドラーを宣言する必要があります。

例:

private Handler     handler         = new Handler();


final ProgressDialog pd = new ProgressDialog(this);
pd.setTitle("Getting topics..");
pd.setMessage("Please while topics are retrieved");
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setIndeterminate(true);

new AsyncTask<Void, Void, Void>() {

    @Override
    protected Void doInBackground(Void... params) {

        GetTopics();

        return null;
    }

    @Override
    protected void onPreExecute() {

        pd.show();
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Void result) {

        BindTopics();

        pd.dismiss();

        handler.post(new Runnable() {

            public void run() {
                // update UI
                // remove loading view
                // load details of topics
            }
        });
        super.onPostExecute(result);
    }

}.execute();
于 2012-04-24T14:36:28.947 に答える
0

私にとってスレッドの主な用途は、アプリがftpサーバーから大量のデータをダウンロードする必要があるときでした。しかし、ダウンロード中は、ユーザーが引き続き私のアプリを使用できるようにしたかったのです。メインスレッドでダウンロードコードを記述した場合、ユーザーはアプリを使用できず、すべてのボタンが機能しませんでした。スレッドの主な考え方は、各スレッドのCPU使用時間を分割することです。

複数のタスクを同時に実行したい場合は、スレッドを使用する必要があります。

于 2012-04-24T14:50:24.840 に答える