处理程序不会在按钮上设置SetText

时间:2013-08-05 22:21:07

标签: android button android-asynctask android-handler

在我的应用程序中,我试图在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();

                }
            }

你可以看到我从一个新的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));
    }

据我所知,这应该允许我从处理程序设置文本。为什么不设置文本?如何使用我的字符串值设置文本?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

如果setText()onPostExecute()不起作用,您可能无法在UI线程上创建AsyncTaskAsyncTask在您创建的主题上运行onPostExecute()

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