在我的应用程序中,我试图在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));
}
据我所知,这应该允许我从处理程序设置文本。为什么不设置文本?如何使用我的字符串值设置文本?
非常感谢任何帮助!
答案 0 :(得分:1)
如果setText()
中onPostExecute()
不起作用,您可能无法在UI线程上创建AsyncTask
。 AsyncTask
在您创建的主题上运行onPostExecute()
。
同样,在当前执行的Handler
上创建Thread
。可能是您的Handler
在后台线程上初始化。尝试使用final static Handler handler = new Handler(Looper.getMainLooper())
。这可以确保将处理程序附加到主线程。