应用程序崩溃,当线程执行时,Android?

时间:2015-05-15 05:51:34

标签: android multithreading

我正在尝试在一个时间间隔内更新textView。即文本随时间的变化而变化。内容存储在一个数组中,但当我尝试从一个线程中执行时,应用程序崩溃了。这是源代码:

import android.content.Intent;
import android.graphics.Typeface;
import android.net.Uri;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.Calendar;


public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    final MessageList sample = new MessageList();
    sample.MessageMethod();

    final Calendar c = Calendar.getInstance();




    new Thread(new Runnable() {
        @Override
        public void run()
        {
             int x = 0;

            while (i<1)
            {
              if(c.get(Calendar.MINUTE)%2==0)
              {
                  ++x;
                  TextView alertMessage =  

 (TextView)findViewById(R.id.messages);
                  String parse = sample.message[x];
                  alertMessage.setText(parse);

              }

            }



        }
    }).start();

应用程序在使用线程之前已成功运行,我不知道是否由于初始化时出错。有什么建议?

3 个答案:

答案 0 :(得分:3)

您必须在UI Thread中运行此部分代码:

 TextView alertMessage = (TextView)findViewById(R.id.messages);
 String parse = sample.message[x];
 alertMessage.setText(parse);

应该是这样的:

new Thread(new Runnable(){
    @Override
    public void run(){
     int x=0;
      while(i<1){
            if(c.get(Calendar.MINUTE)%2==0){
            ++x;
            runOnUiThread(new Runnable(){
             @Override
             public void run(){
              TextView alertMessage=(TextView)findViewById(R.id.messages);
              String parse=sample.message[x];
              alertMessage.setText(parse);
             }
       });
       }
}
}
}).start();

答案 1 :(得分:0)

您无法从UI线程以外的线程更新UI。

TextView alertMessage =  

 (TextView)findViewById(R.id.messages);
                  String parse = sample.message[x];

alertMessage.setText(parse); 这一行就是问题所在。

用下面一行替换你的两行textview代码

runOnUiThread(new Runnable() {

        @Override
        public void run() {
            TextView alertMessage =  

 (TextView)findViewById(R.id.messages);
                  String parse = sample.message[x];
                  alertMessage.setText(parse);

        }
    });

您只能从UI线程更新UI元素。或者你可以在runOnUIThread

的帮助下拨打这一行

您的代码将变为,如下所示

new Thread(new Runnable() {
        @Override
        public void run() {
            int x = 0;

            while (i < 1) {
                if (c.get(Calendar.MINUTE) % 2 == 0) {
                    ++x;
                    final String parse = sample.message[x];
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            TextView alertMessage =

                            (TextView) findViewById(R.id.messages);
                            alertMessage.setText(parse);
                        }
                    });
                }
            }

        }
    }).start();

答案 2 :(得分:0)

final Handler handler = new Handler(); 

new Thread(new Runnable() {
        @Override
        public void run()
        {
             int x = 0;

            while (i<1)
            {
              if(c.get(Calendar.MINUTE)%2==0)
              {
                  ++x;
               handler.post(new Runnable() {
                  @Override
                  public void run() {
                    TextView alertMessage = (TextView)findViewById(R.id.messages);
                    String parse = sample.message[x];
                    alertMessage.setText(parse);
                  }
              });

              }

            }



        }
    }).start();