Android中的基本线程
只是学习Android中的线程(我对线程时代也有点陌生)。我在看其他的帖子,但仍然需要一些澄清。我和HelloWorld保持着简单的关系。我想要的是显示消息:“Hello World,这是一个线程”,每个单词每隔1秒显示一次。我想在消息中使用字符串数组。然后在线程中使用for循环迭代每个元素。我很确定我理解问题的逻辑——因为整个循环都是在延迟时间内执行的。有谁能告诉我如何打破这个界限,以便以1秒的间隔显示每个元素吗?这是我的密码:Android中的基本线程,android,multithreading,Android,Multithreading,只是学习Android中的线程(我对线程时代也有点陌生)。我在看其他的帖子,但仍然需要一些澄清。我和HelloWorld保持着简单的关系。我想要的是显示消息:“Hello World,这是一个线程”,每个单词每隔1秒显示一次。我想在消息中使用字符串数组。然后在线程中使用for循环迭代每个元素。我很确定我理解问题的逻辑——因为整个循环都是在延迟时间内执行的。有谁能告诉我如何打破这个界限,以便以1秒的间隔显示每个元素吗?这是我的密码: public class HelloWorld extends
public class HelloWorld extends Activity {
Handler m_handler;
Runnable m_handlerTask ;
private TextView hello;
private String[] HelloWorld = {
"Hello",
"World",
"This",
"Is",
"A",
"Thread",
};
int i=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_world);
hello = (TextView) findViewById(R.id.hello);
m_handler = new Handler();
m_handlerTask = new Runnable()
{
@Override
public void run() {
if(i<HelloWorld.length-1)
{
hello.append(HelloWorld[i]);
hello.setText("\n");
i++;
}
m_handler.postDelayed(m_handlerTask, 1000);
}
};
m_handlerTask.run();
m_handler.removeCallbacks(m_handlerTask);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.hello_world, menu);
return true;
}
公共类HelloWorld扩展活动{
Handler m_Handler;
可运行的m_handlerTask;
私人文本视图你好;
私有字符串[]HelloWorld={
“你好”,
“世界”,
“这个”,
“是”,
“A”,
“线程”,
};
int i=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u hello\u world);
hello=(TextView)findViewById(R.id.hello);
m_handler=新处理程序();
m_handlerTask=new Runnable()
{
@凌驾
公开募捐{
如果(i使用线程
Thread thread;
private String[] HelloWorld = {
"Hello",
"World",
"This",
"Is",
"A",
"Thread",
};
int i=0;
在onCreate()中
在onCreate()中
对于初学者来说,这里没有使用任何线程,如果您想使用线程,应该是这样的
Thread t = new Thread(new Runnable(){
@Override
public void run(){
for(int i = 0; i < HelloWorld.length; i++){
hello.append(HelloWorld[i]);
Thread.sleep(1000); //wait one second
}
}
});
t.start();
虽然使用普通Java线程
很好,但当您必须修改UI时,只使用它更容易、更好
您可以这样编写AsyncTask
:
public class Task extends AsyncTask<String, String, Void> {
private final TextView textView;
public Task(TextView textView) {
this.textView = textView;
}
protected void onProgressUpdate(String... update) {
textView.append(update[0]);
}
protected Void doInBackground(String... params) {
for (String param : params) {
publishProgress(param);
try {
Thread.sleep(1000)
} catch (InterruptedException e) {
}
}
return null;
}
}
Task task = new Task(hello);
task.execute("Hello", "world", "this", "is", "a", "thread");
谢谢,但是现在应用程序没有显示任何内容。我只是把所有内容都放错了。我将重新发布我的代码。hello.setText(“”);不要这样做添加新行hello.setText(“\n”),并在hello.setText(“\n”)之后检查edit.increment I++@GrahamBorland op正在使用处理程序,因此我发布了解决方案。问题是关于如何在单独的线程中执行此操作的具体问题。@GrahamBorland感谢您至少留下了评论。这有助于我编辑我的答案。我看到用户在没有评论的情况下投票,这无助于给出更好的答案。这里有一个问题(希望不是一个愚蠢的方法)当我尝试实现这个时,eclipse会对过度睡眠大喊大叫——告诉我它没有定义,我需要一个新方法。我如何解决这个问题?谢谢@GrahamBorland fixed.@schwiz Thread.sleep(1000)应该在try后面跟着catchThis看起来不错,在我尝试实现之前,我有一个问题:如果我的消息包含在数组列表中,该如何实现?这将如何影响task.execute?AsyncTask.execute只接受数组。我想它将与task.execute((String[])arrayList.toArray()一起工作,也可以将arrayList作为参数传递到构造函数中。
m_handler.removeCallbacks(m_handlerTask);
Thread t = new Thread(new Runnable(){
@Override
public void run(){
for(int i = 0; i < HelloWorld.length; i++){
hello.append(HelloWorld[i]);
Thread.sleep(1000); //wait one second
}
}
});
t.start();
Thread t = new Thread(new Runnable(){
@Override
public void run(){
for(int i = 0; i < HelloWorld.length; i++){
runOnUiThread(new Runnable(){
@Override
public void run(){
hello.append(HelloWorld[i]);
}
});
Thread.sleep(1000); //wait one second
}
}
});
t.start();
public class Task extends AsyncTask<String, String, Void> {
private final TextView textView;
public Task(TextView textView) {
this.textView = textView;
}
protected void onProgressUpdate(String... update) {
textView.append(update[0]);
}
protected Void doInBackground(String... params) {
for (String param : params) {
publishProgress(param);
try {
Thread.sleep(1000)
} catch (InterruptedException e) {
}
}
return null;
}
}
Task task = new Task(hello);
task.execute("Hello", "world", "this", "is", "a", "thread");