3

刚刚研究 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;
}

}

4

3 回答 3

1

使用线程

     Thread thread;
     private String[] HelloWorld = {
        "Hello",
        "World",
        "This",
        "Is",
        "A",
        "Thread",

         };
     int i=0;

在你的 onCreate()

        thread = new Thread(new Runnable(){

       @Override
       public void run(){
           for( i = 0; i < HelloWorld.length; i++){

           runOnUiThread(new Runnable(){

              @Override
              public void run(){
                hello.append(HelloWorld[i]);
                hell0.append(" ");

              }
           });
           try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
         }

         }


     });
     thread.start();      

我建议你使用处理程序

    Handler m_handler;
    Runnable m_handlerTask ;
    private String[] HelloWorld = {

        "Hello",
        "World",
        "This",
        "Is",
        "A",
        "Thread",

};
int i=0;

在你的 onCreate()

 m_handlerTask = new Runnable()
    {
         @Override 
         public void run() {
             if(i<HelloWorld.length)
             {

            hello.append(HelloWorld[i]);
            hello.append(" ");
            i++;
             }
             else
             {
                 m_handler.removeCallbacks(m_handlerTask);
             }

              m_handler.postDelayed(m_handlerTask, 1000);
         }
    };
    m_handlerTask.run(); 

不需要时停止运行

        m_handler.removeCallbacks(m_handlerTask);
于 2013-05-10T15:12:44.663 回答
1

好吧,对于初学者来说,您在这里没有使用任何线程,如果您想使用线程,它将是这样的。

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

但是,在 Android 中,您不能从后台线程更新 UI。所以你需要在 UI 线程上实际运行更新,有一个辅助方法可以Activity调用runOnUiThread

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();
于 2013-05-10T15:16:57.543 回答
1

虽然使用纯 JavaThreads很好,但当您必须修改 UI 时,使用它会更容易更好AsyncTasks

你可以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;
    }
}

Activity像这样使用它:

Task task = new Task(hello);
task.execute("Hello", "world", "this", "is", "a", "thread");
于 2013-05-10T15:39:32.337 回答