简单Java应用程序(3个按钮-每个按钮启动和停止计数)

简单Java应用程序(3个按钮-每个按钮启动和停止计数),java,android,multithreading,Java,Android,Multithreading,我正在学习Java(我用C++编写了一些代码)。我只是想用线程创建一个应用程序。正如我所知,我不能使用线程来操作UI(主线程) 这个应用程序看起来像这样:画3个按钮,画3个文本框。 当我单击按钮1时,计数从TextView 1开始(从1到inf)。第二个和第三个是一样的。我需要做三个线程,但我不明白如何操作UI(用新的数字更新textview)。我也听说过AsyncTask,但我认为它不适用于这样的应用程序(请阅读,这是用于连接/下载等) 你们中的一些人能解释一下如何解决这个问题吗?我不需要任何

我正在学习Java(我用C++编写了一些代码)。我只是想用线程创建一个应用程序。正如我所知,我不能使用线程来操作UI(主线程)

这个应用程序看起来像这样:画3个按钮,画3个文本框。 当我单击按钮1时,计数从TextView 1开始(从1到inf)。第二个和第三个是一样的。我需要做三个线程,但我不明白如何操作UI(用新的数字更新textview)。我也听说过AsyncTask,但我认为它不适用于这样的应用程序(请阅读,这是用于连接/下载等)

你们中的一些人能解释一下如何解决这个问题吗?我不需要任何代码,只需要一个解释——写这篇文章的最佳方式是什么:)


谢谢大家!

对于文本和按钮,您可以在activity_main.xml文件中添加文本视图和按钮

对于每个按钮,设置一个方法,可能是在单击按钮时开始计算(视图)。在该方法中,添加一个处理程序:

final Handler h = new Handler();
final int DELAY = 1000; //milliseconds

h.postDelayed(new Runnable(){
    public void run(){
        //Increase textview number by one here
        h.postDelayed(this, DELAY);
    }
}, DELAY);
不需要异步任务

以下是您尝试构建的应用程序的简单版本:

主要活动

activity_main.xml



@疯狂,欢迎你。确保应用程序关闭时,循环停止。否则,它将持续运行。
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

TextView tv1;
TextView tv2;
TextView tv3;

Button b1;
Button b2;
Button b3;

int time1 = 0;
int time2 = 0;
int time3 = 0;

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

    tv1 = (TextView)findViewById(R.id.tv1);
    tv2 = (TextView)findViewById(R.id.tv2);
    tv3 = (TextView)findViewById(R.id.tv3);

    b1    = (Button)findViewById(R.id.b1);
    b2    = (Button)findViewById(R.id.b2);
    b3    = (Button)findViewById(R.id.b3);
}

public void startFirstTimer(View v){
    time1 = 0;

    final Handler h = new Handler();
    final int DELAY = 1000; //milliseconds

    h.postDelayed(new Runnable(){
        public void run(){
            time1++;
            tv1.setText(Integer.toString(time1));
            h.postDelayed(this, DELAY);
        }
    }, DELAY);
}
public void startSecondTimer(View view){
    time2 = 0;

    final Handler h = new Handler();
    final int DELAY = 1000; //milliseconds

    h.postDelayed(new Runnable(){
        public void run(){
            time2++;
            tv2.setText(Integer.toString(time2));
            h.postDelayed(this, DELAY);
        }
    }, DELAY);
}
public void startThirdTimer(View view){
    time3 = 0;

    final Handler h = new Handler();
    final int DELAY = 1000; //milliseconds

    h.postDelayed(new Runnable(){
        public void run(){
            time3++;
            tv3.setText(Integer.toString(time3));
            h.postDelayed(this, DELAY);
        }
    }, DELAY);
}
}
<TextView
    android:id="@+id/tv1"
    android:layout_width="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_height="wrap_content"/>
<Button
    android:id="@+id/b1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Start First Timer"
    android:layout_below="@+id/tv1"
    android:onClick="startFirstTimer"/>

<TextView
    android:id="@+id/tv2"
    android:layout_width="match_parent"
    android:layout_below="@+id/b1"
    android:layout_centerHorizontal="true"
    android:layout_height="wrap_content"/>
<Button
    android:id="@+id/b2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Start Second Timer"
    android:layout_below="@+id/tv2"
    android:onClick="startSecondTimer"/>


<TextView
    android:id="@+id/tv3"
    android:layout_width="match_parent"
    android:layout_below="@+id/b2"
    android:layout_centerHorizontal="true"
    android:layout_height="wrap_content"/>
<Button
    android:id="@+id/b3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Start Third Timer"
    android:layout_below="@+id/tv3"
    android:onClick="startThirdTimer"/>