Android中的基本线程

Android中的基本线程,android,multithreading,Android,Multithreading,只是学习Android中的线程(我对线程时代也有点陌生)。我在看其他的帖子,但仍然需要一些澄清。我和HelloWorld保持着简单的关系。我想要的是显示消息:“Hello World,这是一个线程”,每个单词每隔1秒显示一次。我想在消息中使用字符串数组。然后在线程中使用for循环迭代每个元素。我很确定我理解问题的逻辑——因为整个循环都是在延迟时间内执行的。有谁能告诉我如何打破这个界限,以便以1秒的间隔显示每个元素吗?这是我的密码: public class HelloWorld extends

只是学习Android中的线程(我对线程时代也有点陌生)。我在看其他的帖子,但仍然需要一些澄清。我和HelloWorld保持着简单的关系。我想要的是显示消息:“Hello World,这是一个线程”,每个单词每隔1秒显示一次。我想在消息中使用字符串数组。然后在线程中使用for循环迭代每个元素。我很确定我理解问题的逻辑——因为整个循环都是在延迟时间内执行的。有谁能告诉我如何打破这个界限,以便以1秒的间隔显示每个元素吗?这是我的密码:

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");