0

次のコードは現在、私のメインのonCreate()で実行されています。現在、テスト中です。目標は後でこれらを動的に更新できるようにすることですが、その方法を見つけることができないため、私はこれをAsyncTaskで実行しようとしています。誰かが何か洞察を持っているかどうか疑問に思いました。ありがとうございました!

LinearLayout ObjectLayout = (LinearLayout) findViewById(R.id.LayoutObjects);

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.height = 140;
    params.width = 140;
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
    for (int i = 0; i < 10; i++) {

        Button btn = new Button(this);
        btn.setLayoutParams(params);
        btn.setPadding(0, 50, 0, 0);
        btn.setTextSize(14);
        btn.setText("MyButton");
        btn.setTextColor(color.Yellow);
        // Drawable image = Drawable.createFromPath("@drawable/add_page");
        // //
        // btn.setBackgroundDrawable(image);

        btn.setBackgroundDrawable(getResources().getDrawable(
                R.drawable.add_page));
        // btn.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

        ObjectLayout.addView(btn);

    }




private class GetDataTask2 extends AsyncTask<Void, Void, Void> {

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

        // Simulates a background job.

        for (int i = 0; i < 10; i++) {
            publishProgress(btn2);
        }

        return null;
    }

    protected void publishProgress(Button btn2) {
        btn2.setLayoutParams(params2);
        btn2.setPadding(0, 50, 0, 0);
        btn2.setTextSize(14);
        btn2.setText("MyButton yo yo yo ");
        btn2.setTextColor(color.Yellow);

        btn2.setBackgroundDrawable(getResources().getDrawable(
                R.drawable.add_page));
        ObjectLayout2.addView(btn2);
        // Process width and height
    }

    protected void onPostExecute() {
        // Do some stuff here

        // Call onRefreshComplete when the list has been refreshed.

    }
}

このコードは私が非同期として持っているものであり、これをテストして理解するために、メインアクティビティのインスタンスとしてレイアウトとボタンの作成を定義しましたが、エラーが発生し、操作していますが、何も機能しないようです。

4

2 に答える 2

1

私は似たようなことをしなければなりませんでした(約80〜120個のカスタムビューをスクロール可能なレイアウトに一度にインフレート/追加します)、私のAsyncTask構造は次のようなものでした:

まず、ContextandLinearLayoutを AsyncTask に渡す必要があります。これにはカスタムコンストラクターを使用してください。

onPreExecute(): 進行状況ダイアログ、または「ビジー」を示す何かを表示します。

doInBackground():あなたと同じようにループにボタンを作成しますが、そのスレッドではそれ以上は作成しないでください。作成/インフレの部分に最も時間がかかるので、心配はいりません。各ループ サイクルの終わりに、publishProgress(btn).

onProgressUpdate():(上から渡された)ボタンを好きなように(テキスト/パディング/など)設定し、レイアウトに追加します。

onPostExecute(): ダイアログを閉じます。

注: 1 つのスレッドを膨らませるために使用し、もう 1 つのスレッドをレイアウトするために使用しても、速度はあまり向上しません。私は AsyncTask なしで約 2.5 秒から、AsyncTask を使用すると 2 秒強になりました。ただし、この方法では、すべてのビューを膨張させている間、UI がハングアップするのではなく、明確な進行状況ダイアログが表示されます。それほど速くはないかもしれませんが、はるかに反応が良く、それ本当に重要なことです.

編集: カスタム コンストラクターの例については、この質問を確認してください。また、コンストラクターをスキップして直接メソッドに渡す方法も示していますdoInBackground()。どちらの方法でも問題なく動作します。

于 2012-09-27T02:20:49.763 に答える
0

AsyncTask は通常、長いバックグラウンド操作用です。そのようなタスクの後にボタンを更新したくない場合を除き、なぜボタンを使用する必要があるのか​​ わかりません。

ただし、それが実際の目的である場合は、AsyncTask の doInBackground() 関数で必要なタスク/コードを実行します。それが完了すると、AsyncTask の onPostExecute() 関数で、それに応じて UI を更新します。

おそらく、コミュニティがより具体的な回答を提供できるように、「動的にロードする」要件の性質についてもう少し詳細を含めることができます。

于 2012-09-27T00:34:08.000 に答える