我创建了一个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;
}
}
我知道我不需要把它放在一个线程中,我只是试验看它是否会起作用而不是。
答案 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>