我正在尝试制作一个应用程序,每秒将一笔随机金额的资金从一个银行帐户转移到另一个银行帐户,直到第一个帐户中的资金降到100以下。我已经成功实施了一个执行此操作的线程,但我很棒无法更新UI EditText字段。它应该在资金转移时每秒更新一次,但只有在资金降至100以下后才更新。我认为这与我的处理程序的实现有关,当我的transactionAThread运行时,UI线程无法更新。这是我的mainActivity的代码。我可以根据需要发布更多代码,但不愿意这样做,因为这是为了课程。
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button startButton = (Button)findViewById(R.id.startButton);
final EditText a1Text = (EditText)findViewById(R.id.a1Text);
final EditText a2Text = (EditText)findViewById(R.id.a2Text);
final BankAccount b1 = new BankAccount(10000);
final BankAccount b2 = new BankAccount(10000);
final int[] x = new int[1];
final Handler mHandler = new Handler();
//Set a1Text
StringBuilder sb1 = new StringBuilder();
sb1.append("");
sb1.append(b1.balance);
String str1 = sb1.toString();
a1Text.setText(str1);
//Set a2Text
StringBuilder sb2 = new StringBuilder();
sb2.append("");
sb2.append(b2.balance);
String str2 = sb2.toString();
a2Text.setText(str2);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (x[0] == 0){
x[0] = 1;
while (b1.balance > 100) {
//sleep(1000) in below transactionAThread
transactionAThread t1 = new transactionAThread(b1, b2);
t1.run();
mHandler.post(new Runnable() {
@Override //handler that tries to update UI with no avail
public void run() {
StringBuilder sb1 = new StringBuilder();
sb1.append("");
sb1.append(b1.balance);
String str1 = sb1.toString();
a1Text.setText(str1);
//Set a2Text
StringBuilder sb2 = new StringBuilder();
sb2.append("");
sb2.append(b2.balance);
String str2 = sb2.toString();
a2Text.setText(str2);
}
});
}
}
else {
x[0] = 0;
}
}
});
}
我的
答案 0 :(得分:0)
此代码
while (b1.balance > 100) {
transactionAThread t1 = new transactionAThread(b1, b2);
t1.run();
mHandler.post(new Runnable() {
这里的问题很多。你每次创建一个线程(你创建了数千个线程)并且每次都发布一个新的runnable(创建数千个runnables)。
你应该只创建一次线程(实际上,你应该使用AsyncTask
,但那是另一个故事)。而且,你只应该从INSIDE工作线程中调用handler.post
!
答案 1 :(得分:0)
将UI代码移动到您的工作线程。您的代码可以修改如下:
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (x[0] == 0) {
x[0] = 1;
transactionAThread t1 = new transactionAThread(b1, b2) {
@Override
public void run() {
super.run();
while (b1.balance > 100) {
// TODO: transaction. calculate b1 and b2.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mHandler.post(new Runnable() {
@Override //handler that tries to update UI with no avail
public void run() {
StringBuilder sb1 = new StringBuilder();
sb1.append("");
sb1.append(b1.balance);
String str1 = sb1.toString();
a1Text.setText(str1);
//Set a2Text
StringBuilder sb2 = new StringBuilder();
sb2.append("");
sb2.append(b2.balance);
String str2 = sb2.toString();
a2Text.setText(str2);
}
});
}
}
};
t1.start();
} else {
x[0] = 0;
}
}
});