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()中不起作用onPostExecute(),则您可能没有AsyncTask在 UI 线程上创建您的。AsyncTask在您创建它的线程上运行onPostExecute()

再次,Handler在当前执行的Thread. 可能是您Handler在后台线程上初始化。尝试使用final static Handler handler = new Handler(Looper.getMainLooper()). 这确保处理程序附加到主线程。

于 2013-08-05T22:55:44.653 回答