android中的线程无输出

时间:2012-08-01 14:57:32

标签: java android

我创建了一个Android应用程序,用户输入一个字符串和一个数字,其中数字将计算为其阶乘。一切正常,但当我将我的代码包含在线程中时,没有输出。

这是我的源代码:

package com.inputandfactorial;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button chkCmd;
    EditText input1, input2;
    TextView display1, display2;
    int res = 1,factint;
    String fact;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chkCmd = (Button) findViewById(R.id.bProcess);
        input1 = (EditText) findViewById(R.id.etString);
        input2 = (EditText) findViewById(R.id.etFactorial);
        display1 = (TextView) findViewById(R.id.tvString);
        display2 = (TextView) findViewById(R.id.tvFactorial);

        chkCmd.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {



                Thread t1 = new Thread(){
                    public void run(){
                        String change = input1.getText().toString();
                        fact = input2.getText().toString();
                        factint = Integer.parseInt(fact);
                        for (int i = 1; i <= factint; i++) {
                            res = res * i;
                        }
                        try {
                            display2.setText("The factorial of " + fact + " is " + res);
                            display1.setText("The string value is " + change);
                        } catch (Exception e) {

                        }
                    }
                };
                t1.start();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

我知道我不需要把它放在一个线程中,我只是试验看它是否会起作用而不是。

4 个答案:

答案 0 :(得分:0)

您无法在线程上对UI进行更改。 UI上的所有更改都需要在UIThread上完成。要轻松完成此操作,请使用AsyncTask:

http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:0)

我同意上面关于你不需要线程的评论,但是为了回答你的问题......

您需要查看AsyncTasks。我写了一个之前的答案,应该为您提供一个工作示例AsyncTask Android example

接着解释说,您只能从原始GUI线程影响UI,因此上面的代码将不起作用。

答案 2 :(得分:0)

您只能操纵UI线程上的View。将代码包装在Runnable中并使用Activity#runOnUiThread(Runnable action)在主线程上执行:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        display2.setText("The factorial of " + fact + " is " + res);
        display1.setText("The string value is " + change);
    }
}

那就是说,简单算术不保证首先使用Thread ......

答案 3 :(得分:0)

1。保持 UI在UI线程上运行,非UI在非UI线程上工作始终是一种很好的做法。随着HoneyComb Android版本的发布,这成为法律

2. android 应用程序在UI线程上启动,创建任何其他线程会让您退出Android线程,此线程将是非UI线程。

3。要将作品 Non-UI主题发回 UI主题,我们需要使用这些 2种方式:

- Thread以及Handler

- AsyncTask,在Android 中专门用于同步UI和非UI线程,也称为Painless threading。< / p>