0

私は通常 .Net で作業していますが、Android アプリを開発する必要があります。だから私はAndroidの初心者です。事前に間違いをお詫びします!:)

ここに私の話があります。ボタンクリックでビューを使用して顧客リストを作成しています(コードビハインドでUI要素を作成しています)。データベースからデータを取得しています。そのため、データを取得してビューを作成するのに時間がかかります。私がやりたいことは、顧客リストが作成されている間に進行状況ダイアログを表示することです。現在、私はそれを実行することができます。しかし問題は、進行状況ダイアログがすぐに表示されず、customerlist と進行状況ダイアログが同時に表示されることです。

これが私のボタンクリックです。

public void ShowCustomers(View view){
        final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                dialog.setTitle("Title");
                dialog.setMessage("Loading...");
                if(!dialog.isShowing()){
                    dialog.show();
                }
            }
        });
        new Thread() {
            public void run() {
                try{
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            PopulateRecentGuests(); //Creates customer list dynamically
                            dialog.dismiss();
                        }
                    });
                } catch (Exception e) {
                    Log.e("tag", e.getMessage());
                }
            }
        }.start();
    }

そして、顧客を入力します。

public void PopulateRecentGuests(){
        LinearLayout customers = (LinearLayout)findViewById(R.id.customers);
        String query = "SELECT * from Table";
        ModelCustomer customerModel = new ModelCustomer();
        ArrayList<HashMap<String, String>> recentGuests = customerModel.RetrievingQuery(query);
        customersCount = recentGuests.size();
        Context context = getApplicationContext();
        if(customersCount < 1)
            Toast.makeText(context, "There is no available customer in database!", Toast.LENGTH_LONG);
        else if(!recentGuests.get(0).containsKey("err")) {
            for(int i = 0; i < recentGuests.size(); i++){
                HashMap<String, String> guest = recentGuests.get(i);
                Button button = new Button(context);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                params.setMargins(0,5,0,5);
                button.setLayoutParams(params);
                button.setWidth(800);
                button.setHeight(93);
                button.setTag(guest.get("id"));
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        System.out.println("New button clicked! ID: " + v.getTag());
                        Intent intent = new Intent(getApplicationContext(), ProductPageActivity.class);
                        intent.putExtra("CustomerID", v.getTag().toString());
                        startActivity(intent);
                    }
                });
                button.setBackgroundColor(Color.parseColor("#EFEFEF"));
                button.setText(guest.get("FirstName") + " " + guest.get("LastName") + "             " + guest.get("GuideName"));
                button.setTextColor(Color.BLACK);
                button.setTextSize(20);
                button.setEnabled(false);
                customers.addView(button); // customers is a linear layout and button is being added to customers
                Button guest_list_btn = (Button)findViewById(R.id.guest_list_btn);
                guest_list_btn.setEnabled(true);
            }
        }
        else{
            CharSequence text = recentGuests.get(0).get("err");
            int duration = Toast.LENGTH_LONG;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }

        Button guest_list_btn = (Button)findViewById(R.id.guest_list_btn);
        Button guest_list_close_btn = (Button)findViewById(R.id.guest_list_close_btn);

        customers.setVisibility(View.VISIBLE);
        AnimationSet aset = new AnimationSet(true);
        aset.setFillEnabled(true);
        aset.setInterpolator(new LinearInterpolator());

        AlphaAnimation alpha = new AlphaAnimation(0.0F, 1.0F);
        alpha.setDuration(400);
        aset.addAnimation(alpha);

        TranslateAnimation trans = new TranslateAnimation(200, 0, 0, 0);
        trans.setDuration(400);
        aset.addAnimation(trans);
        customers.startAnimation(aset);
        guest_list_btn.setEnabled(false);
        guest_list_close_btn.setEnabled(true);
        for(int i = 0; i < customers.getChildCount(); i++){
            View child = customers.getChildAt(i);
            child.setEnabled(true);
        }

    }

私の調査の結果、ルーパーの後に runonuithread が呼び出されることがわかりました。私の質問は、進行状況ダイアログをすぐに表示してから、顧客リストを作成する (UI 要素を作成する) ことができる方法です。ちなみに、最初は asynctask でやってみたのですが、できませんでした。

よろしくお願いします!

4

1 に答える 1

1

しかし問題は、進行状況ダイアログがすぐに表示されず、customerlist と進行状況ダイアログが同時に表示されることです。

これは、メイン UI スレッドで長い操作 (およびダイアログを順番に閉じる) を行うためです。代わりに、データの取得 (時間がかかる) とビューの作成 (ダイアログを閉じることを伴う) の間で物事を分離する必要があります。

//...
new Thread() {
            public void run() {
                // do the long operation on this thread
                final ArrayList<HashMap<String, String>> recentGuests = customerModel.RetrievingQuery(query);
                // after retrieving the data then use it to build the views and close the dialog on the main UI thread
                try{
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // remove the retrieving of data from this method and let it just build the views
                            PopulateRecentGuests(recentGuests); 
                            dialog.dismiss();
                        }
                    });
                } catch (Exception e) {
                    Log.e("tag", e.getMessage());
                }
            }
        }.start();
于 2015-02-09T19:01:42.597 に答える