自定义线程并更新EditText android

时间:2015-01-14 03:53:27

标签: java android multithreading handler runnable

我正在尝试制作一个应用程序,每秒将一笔随机金额的资金从一个银行帐户转移到另一个银行帐户,直到第一个帐户中的资金降到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;
            }

        }
    });
}

我的

2 个答案:

答案 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;
                }

            }
        });