Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单求和程序androidjava_Java_Android_For Loop - Fatal编程技术网

简单求和程序androidjava

简单求和程序androidjava,java,android,for-loop,Java,Android,For Loop,无错误,编译,无运行时错误。 嘿,我有一个关于Android sum的简单问题。我在做一个简单的求和,代码编译,技术上做它想做的,求和直到大于120。但是,我希望输出在循环中显示每个和。不幸的是,它只是立即跳到textview上的最后一个总和。我尝试使用一个sleep函数,wait函数,但结果是它会等待所有循环的时间量,直到总和大于120,然后输出最终的总和。在这种情况下是4950。在文本视图中显示每个总和有什么建议吗 我还尝试使用这行代码,它可以单独显示每个和,但是,它立即启动了计时器。它不应

无错误,编译,无运行时错误。 嘿,我有一个关于Android sum的简单问题。我在做一个简单的求和,代码编译,技术上做它想做的,求和直到大于120。但是,我希望输出在循环中显示每个和。不幸的是,它只是立即跳到textview上的最后一个总和。我尝试使用一个sleep函数,wait函数,但结果是它会等待所有循环的时间量,直到总和大于120,然后输出最终的总和。在这种情况下是4950。在文本视图中显示每个总和有什么建议吗

我还尝试使用这行代码,它可以单独显示每个和,但是,它立即启动了计时器。它不应该这样做。 Toast.makeText(MainActivity.this,“SUM:+sum1,Toast.LENGTH_SHORT).show()

我的简单应用程序的基本目标 1) 显示每个总数 2) 当总和大于120时,启动计时器

问题:我如何让它在文本视图上单独显示每个总和,而不是跳转到最终总和

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

}