0

私のアプリケーションでは、単にsetText()自分のButton purchaseButton. 値を取り、AsyncTask を初期化して割引を見つけるためのサーバー呼び出しを完了するアラート ダイアログがあります。

それはすべて正常に機能しonPostExecute()ます。

onPostExecute():

protected void onPostExecute(String result) {
            Log.d(tag,"Result of POST: " + result);
            if(result != null){
                if(result.equals("NO")){
                    createAlert(1);

                }else{
                    result = result.replaceAll("YES", "");
                    String discount = result;
                    discountPrice = price - Double.parseDouble(discount);
                    Log.d(tag, "Discount price after pull:" + discountPrice);
                    //setPurchase("Purchase $" + String.valueOf(discountPrice));

                    new Thread(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            Message msg = handler.obtainMessage();
                            msg.what = (int) discountPrice;
                            handler.sendMessage(msg);
                        }
                    }).start();

                }
            }

new Thread() からハンドラーを呼び出していることがわかります。これにより、ハンドラーにアクセスできますが、ハンドラーからボタンのテキストを設定することはありません。

ハンドラー メソッド:

final static Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg){
            Log.d(tag, "entered handler");
            if(msg.what == discountPrice)
            {
                setPurchaseText(msg.what);
            }
        }
    };

setPurchaseText() メソッド:

private static void setPurchaseText(int value){
        Log.d(tag, "Entered setPurchaseText");
        purchaseButton.setText("Purchase $" + String.valueOf(value));
    }

私の知る限り、これによりハンドラーからテキストを設定できるはずです。テキストを設定しないのはなぜですか?また、文字列値でテキストを設定するにはどうすればよいですか?

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

4

1 に答える 1

1

setText()が で機能しない場合は、UI スレッドonPostExecute()で作成していない可能性があります。作成したスレッドで実行されます。AsyncTaskAsyncTaskonPostExecute()

繰り返しHandlerますが、現在実行中の に作成されThreadます。Handlerバックグラウンドスレッドで初期化されている可能性があります。を使ってみてくださいfinal static Handler handler = new Handler(Looper.getMainLooper())。これにより、ハンドラーがメイン スレッドにアタッチされます。

于 2013-08-05T22:55:44.653 に答える