Java 在应用程序运行时每秒更新一次TextView

Java 在应用程序运行时每秒更新一次TextView,java,android,Java,Android,我是Android编程新手,但我对Java非常熟悉,所以 在这个应用程序中,我需要创建一个死亡/出生计数器和总人口计数器,因此我需要每秒更新活动中的字符串,但我无法找到任何解决方案 这是我的主要活动: public class MainActivity extends ActionBarActivity { static int nasc; static int mortes; static int popTotal; @Override protec

我是Android编程新手,但我对Java非常熟悉,所以

在这个应用程序中,我需要创建一个死亡/出生计数器和总人口计数器,因此我需要每秒更新活动中的字符串,但我无法找到任何解决方案

这是我的主要活动:

public class MainActivity extends ActionBarActivity {

    static int nasc;
    static int mortes;
    static int popTotal;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        nasc = 0;
        mortes = 0;
        popTotal = 0;
        setContentView(R.layout.activity_main);

        final TextView view = new TextView(this);
        Boolean menu = false;
        Handler handler = new Handler();
        while (menu == false) {
            handler.postDelayed(new Runnable() {
                public void run() {
                    view.setText("Births : " + getNasc() + ".");
                    view.append("\n");
                    view.append("Deaths : " + getMortes() + ".");
                    view.append("\n");
                    view.append("Total Population : " + getPopTotal() + ".");
                    setContentView(view);
                }
            }, 1000);
        }
    }

    private int getPopTotal() {
        popTotal = nasc - mortes;
        return popTotal;
    }

    private int getMortes() {
        mortes = (int) (mortes + 1.7);
        return mortes;
    }

    private int getNasc() {
        nasc = nasc + 3;
        return nasc;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.textView) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
我做错了什么?

试试这个:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    nasc = 0;
    mortes = 0;
    popTotal = 0;
    setContentView(R.layout.activity_main);

final TextView view = (TextView)findViewById(R.id.textView_id);

String allText="";
Boolean menu = false;
Handler handler = new Handler();
while (menu == false) {
    handler.postDelayed(new Runnable() {
        public void run() {
            allText+="Births : " + getNasc() + ".";
            allText+="\n";
            allText+="Deaths : " + getMortes() + ".";
            allText+="\n";
            allTExt+="Total Population : " + getPopTotal() + ".";
            view.setText(allText);
            allText="";//reset the string
        }
    }, 1000);
}
}`

在您的activity_main.xml中,在您的文本视图声明中添加

<TextView ...
   ... <!--other params that you have set-->
   android:id="@+id/textview_id"
   ... />

您需要做的是删除while循环,并在用新总数更新UI后,每秒重新运行Runnable if
菜单==false

我只是让Runnable成为一个成员变量,而不是一个匿名类,使用StringBuilder为TextView构建文本,然后在每次运行完成时,如果
菜单
仍然为false,则重新运行Runnable,从而使这个实现正常工作

public class MainActivity extends ActionBarActivity {

    static int nasc;
    static int mortes;
    static int popTotal;
    TextView view;
    Handler handler;
    Boolean menu;

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

        nasc = 0;
        mortes = 0;
        popTotal = 0;
        view = (TextView) findViewById(R.id.text);
        menu = false;
        handler = new Handler();
        handler.postDelayed(updateText, 1000);
    }

    public Runnable updateText = new Runnable() {
        @Override
        public void run() {
            StringBuilder sb = new StringBuilder();
            sb.append("Births : " + getNasc() + ".");
            sb.append("\n");
            sb.append("Deaths : " + getMortes() + ".");
            sb.append("\n");
            sb.append("Total Population : " + getPopTotal() + ".");

            view.setText(sb.toString());

            if (menu == false){
                handler.postDelayed(this, 1000);
            }
        }
    };

    //.................
activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:id="@+id/text" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

导入此:
// 导入java.util.concurrent.Executors; 导入java.util.concurrent.ScheduledExecutorService; // 每一分钟使用一次:

ScheduledExecutorService scheduleTaskExecut = Executors.newScheduledThreadPool(5);

    // This run every one minute
    scheduleTaskExecut.scheduleAtFixedRate(new Runnable() {
      public void run() {
//in this Methos Update Your Text as You Need
UpdateYourText();

      }
    }, 0, 1, TimeUnit.MINUTES);

试着用这种方法让我帮你

public class test extends Activity {

private TextView textView;
private int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
textView = (TextView)findViewById(R.id.text);
set();
}


private void set(){

final String text ="A n d r o i d P r o g r a m m i n g";
final String[] words = text.toString().split(" ");
final Handler handler = new Handler();

handler.post(new Runnable(){
    @Override
    public void run() {
        textView.setText(""+words[i]);
        i++;
        if(i < words.length) {
            handler.postDelayed(this, 1000);
        }
    }
});
}}
公共类测试扩展活动{
私有文本视图文本视图;
私有整数i=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
textView=(textView)findViewById(R.id.text);
set();
}
私有空集(){
最终字符串text=“A n d r o i d P r o g r A m i n g”;
最后一个字符串[]单词=text.toString().split(“”);
最终处理程序=新处理程序();
handler.post(新的Runnable(){
@凌驾
公开募捐{
textView.setText(“+words[i]);
i++;
如果(i
在活动主视图中添加文本视图,并在中更新,而不是每次更新setContentView。第二点:使用一个本地字符串并用您的数据更新该字符串,然后按该字符串设置文本,这样对我来说更好。让我们试试看,嗯,我认为在
onCreate()
中加入while循环会阻止活动生命周期回调的正确执行,因为在
菜单
等于true之前,它永远不会进入
onResume()
中。谢谢,我们可以为您安排下面给出的ExecutorService答案并更新其中的textview,我的主要错误是使用While循环?