简单求和程序androidjava
无错误,编译,无运行时错误。 嘿,我有一个关于Android sum的简单问题。我在做一个简单的求和,代码编译,技术上做它想做的,求和直到大于120。但是,我希望输出在循环中显示每个和。不幸的是,它只是立即跳到textview上的最后一个总和。我尝试使用一个sleep函数,wait函数,但结果是它会等待所有循环的时间量,直到总和大于120,然后输出最终的总和。在这种情况下是4950。在文本视图中显示每个总和有什么建议吗 我还尝试使用这行代码,它可以单独显示每个和,但是,它立即启动了计时器。它不应该这样做。 Toast.makeText(MainActivity.this,“SUM:+sum1,Toast.LENGTH_SHORT).show() 我的简单应用程序的基本目标 1) 显示每个总数 2) 当总和大于120时,启动计时器 问题:我如何让它在文本视图上单独显示每个总和,而不是跳转到最终总和简单求和程序androidjava,java,android,for-loop,Java,Android,For Loop,无错误,编译,无运行时错误。 嘿,我有一个关于Android sum的简单问题。我在做一个简单的求和,代码编译,技术上做它想做的,求和直到大于120。但是,我希望输出在循环中显示每个和。不幸的是,它只是立即跳到textview上的最后一个总和。我尝试使用一个sleep函数,wait函数,但结果是它会等待所有循环的时间量,直到总和大于120,然后输出最终的总和。在这种情况下是4950。在文本视图中显示每个总和有什么建议吗 我还尝试使用这行代码,它可以单独显示每个和,但是,它立即启动了计时器。它不应
public void onClick(View v)
for(i=0;i<100;i++)
{
sum1 = sum1 + i;
sum.setText("Sum:"+sum1);
if(sum1 > 120)
{
timer.start();
}
}
}
public void onClick(视图v)
对于(i=0;i 120)
{
timer.start();
}
}
}
谢谢您的时间。问题是
onClick()
在UI线程上运行。这意味着整个方法必须在UI再次更新之前完成,因此突然跳到最后一个数字。这也是使用Thread.Sleep()
时不会发生任何事情的原因<代码>睡眠()在这种情况下应用于UI线程,因此整个应用程序将冻结
如果你想让TextView计数,你必须使用。将循环和线程.sleep()添加到doInBackground()
,发布进度并在onProgressUpdate()中设置文本。该链接实际上包含了一个很好的示例,应该对您有用。它“跳转”到最后一个链接的原因是,单击操作会在阻塞UI线程的同时运行for循环。实际上,您无法看到文本正在更改,但它正在更改。您可以通过使用or来完成所需的任务,or基本上为您创建了一个单独的线程。它还可以处理您需要的延迟。只需在计时器执行方法中进行计算
//make sure these are global
int i = 0;
int sum1 = 2;//not really sure where your sum starts so you choose
TimerTask leTask = new TimerTask() {
public void run() {
sum1 = sum1+i;
i++;
/*I don't actually remember if you must go back to the main thread
* when in the tasks run method. Incase you get an error because
* of that then just do that quickly. I have included a link for
* you on how to do that if necessary.*/
sum.setText("Sum:"+sum1);
if(sum1 > 120){
/*Start your actually timer here
* and stop execution of leTask by calling the cancel method*/
}
}
int delay = 0;//you don't really want a delay since you want it immediately after click
int everySecond = 1000;
timer.scheduleAtFixedRate(leTask, 0, everySecond);
请记住,我设置ti的方式只是一个例子。取消时,您应该确保您有权访问leTask
(或您所称的任何内容)i
和sum1
也应该是全局的delay
和everySecond
不必在变量中。我这样做是为了解释他们是怎么做的,这样才更有意义。我更喜欢这种方法,因为除了更新TextView之外,您不必担心UI线程的问题
编辑:您还可以使用TextView
中的方法从计时器访问UI。它看起来像这样:
sum.post(new Runnable() {
public void run() {
sum.setText("Sum:"+sum1);
});
}
EDIT2:
我必须包含此编辑,以便将来遇到此问题的用户能够彻底了解,因为我刚刚发现Timer
和TimerTask
不再是调度命令等的首选方法。现在应该是ScheduledThreadPoolExecutor
。虽然这种情况已经发生了一段时间,但我在这里遇到的问题并没有太多报道。无论哪种情况,android都在文档中有它。这就像第二句话。这是我建议的解决方案:D
活动\u main.xml
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/resultView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/startButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start counting" />
</LinearLayout>
您是想一次一个地显示每个总和,还是希望视图显示所有总和?一次一个我可能应该补充一点,使用计时器会更容易。虽然使用线程、睡眠和更新UI正是您需要的过程,但计时器基本上内置了更新UI的功能。因此,使用计时器每2秒或其他方式启动一次,然后启动最后一个计时器来执行您需要的任何操作似乎要简单得多。我是否可以简单地定义一个计时器,然后将其放在sum.setText行之后?谢谢您提供的示例!
public class MainActivity extends Activity implements OnClickListener {
private static final long SUM_DELAY = 100;
private TextView mResultView;
private Button mStartButton;
private Handler mHandler = new Handler();
private int mSum = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultView = (TextView) findViewById(R.id.resultView);
mStartButton = (Button) findViewById(R.id.startButton);
mStartButton.setOnClickListener(this);
}
private Runnable sumTask = new Runnable() {
@Override
public void run() {
mSum += 1;
if (mSum > 120) {
mSum = 0;
mStartButton.setEnabled(true);
return;
}
mResultView.setText(String.valueOf(mSum));
mHandler.postDelayed(this, SUM_DELAY);
}
};
@Override
public void onClick(View view) {
if (view.getId() == mStartButton.getId()) {
mStartButton.setEnabled(false);
sumTask.run();
}
}
}