我遇到一个问题,我的进度对话框不显示或不执行任何操作。我正在制作一个可以转换值的货币转换器。这是我的代码:
if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") && edittextdollars.length() > 0 && edittexteuros.length()==0) {
while (edittextdollars.equals("")) {
final ProgressDialog myPd_ring=ProgressDialog.show(getActivity(), "", "Loading...", true);
myPd_ring.setCancelable(true);
new Thread(new Runnable() {
@Override
public void run() {
try
{
convertvalues("USD", "EUR");
}catch(Exception e){
}
myPd_ring.dismiss();
}
}).start();
}
}
没有进度对话框,如所示:
if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") && edittextdollars.length() > 0 && edittexteuros.length()==0) {
convertvalues("USD", "EUR");
}
它有效,但是在返回值之前,按下了“计算”按钮几秒钟。我想要一个progressdialog显示该值正在加载。我已经搜索过Google,但没有任何效果。任何有关此问题的帮助表示赞赏。
附言我希望您发布代码,而不是只说没有任何代码的解决方案。另外,请发布任何您认为对我有帮助的网站(例如教程)。再次感谢。
编辑:
当我添加以下代码时:
if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") && edittextdollars.length() > 0 && edittexteuros.length()==0) {
myPd_ring = ProgressDialog.show(getActivity(), "", "Loading...", true, true);
new Thread(new Runnable() {
@Override
public void run() {
try {
convertvalues("USD", "EUR");
} catch(Exception e) {
}
}
}).start();
}
@Override
public void afterTextChanged(Editable arg0) {
myPd_ring.dismiss();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
我已经实现了TextWatcher,但是它不起作用。 progressdialog会一直保留在那里,并且值不会改变。任何帮助将不胜感激。
最佳答案
您所做的不正确。
while (edittextdollars.equals("")) { // this while loop is not the way to wait for calculation finish...inside this while loop you are spwaning a thread which is not correct
final ProgressDialog myPd_ring=ProgressDialog.show(getActivity(), "", "Loading...", true); //here you are showing the dialog
myPd_ring.setCancelable(true);
new Thread(new Runnable() {
@Override
public void run() {
try {
convertvalues("USD", "EUR");
} catch(Exception e) {
}
myPd_ring.dismiss(); // the run method can be called within few milliseconds of starting the thread..so in essence immediately you are removing your dialog
}
}).start(); // just after showing the dialog you are starting the thread
}
我建议进行以下更改(我假设您的方法
convertvalues
是更改edittexteuros
文本的方法):1.在活动课程中声明myPd_ring
ProgressDialog myPd_ring = null;
2.让您的活动实现TextWatcher(添加未实现的方法)
public class YourActivity extends Activity implements TextWatcher
3.用您的
EditText edittexteuros
添加TextWatcher。edittexteuros = (EditText) findViewById(R.id.youreditTextId);
edittexteuros.addTextChangedListener(YourActivity.this);
4.计算部分并显示对话框
if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") && edittextdollars.length() > 0 && edittexteuros.length() == 0) {
myPd_ring = ProgressDialog.show(getActivity(), "", "Loading...", true, true);
new Thread(new Runnable() {
@Override
public void run() {
try {
convertvalues("USD", "EUR");
} catch(Exception e) {
}
}
}).start();
}
5.从
afterTextChanged
解散Dialog@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
myPd_ring.dismiss();
}
编辑:
您确定
current
始终是有效值吗?作为预防措施,您需要在异常情况下显示一些错误文本(您始终需要设置一些文本,否则对话框将永远不会关闭)。请调试并检查您是否始终从网络获得正确的响应。我提供给您的代码可以在我的测试设置中完美运行,因此您的问题可能现在出在其他地方。您将需要调试并找出答案。YahooCurrencyConverter ycc = new YahooCurrencyConverter();
try {
current = ycc.convert(convertfrom, convertto);
edittexteuros.setText(df.format(val*current));
return "passed";
} catch (Exception e) {
edittexteuros.setText("some error message");
return "passed";
}