1

エラーなし、コンパイル、実行時エラーなし。Android sum について簡単な質問があります。私は単純な合計を行っています。コードはコンパイルされ、技術的には想定どおりに実行され、120 を超えるまで数値が合計されます。ただし、ループを通過するときに出力に各合計を表示したかったのです。残念ながら、テキストビューの最後の合計にすぐにジャンプします。スリープ機能、待機機能を使ってみたのですが、合計が 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();
                            }
                    }

    }

お時間をいただきありがとうございます。

4

3 に答える 3

2

最後のものに「ジャンプ」する理由は、UI スレッドをブロックしている間、クリックする行為が for ループを実行するためです。実際には、テキストの変化を見ることはできませんが、変化しています。基本的に別のスレッドを作成するTimerまたはTimerTaskを使用して、必要なことを達成できます。また、必要な遅延も処理します。Timers 実行メソッドで計算を行うだけです。

//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);

私が設定した方法は一例に過ぎないことを覚えておいてください。leTaskキャンセルされたときにアクセスできることを確認する必要があります。iまた、グローバルでsum1ある必要があります。delay変数である必要はありeverySecondません。彼らが何をしているのかを説明するためにそれをしたので、もう少し理にかなっています。TextView の更新を除いて、UI スレッドのことを気にしないので、この方法の方が気に入っています。

編集: のpostメソッドを使用して、タイマーから UI にアクセスすることもできますTextView。次のようになります。

sum.post(new Runnable() {
    public void run() {
        sum.setText("Sum:"+sum1);   
    });
}

EDIT2:


この編集を含める必要があるのは、これに出くわした将来のユーザーが完全に理解できるようにするためです。これは、コマンドをスケジュールするための推奨される方法ではなくなっていることがわかったTimerためTimerTaskです。現在はそうすべきScheduledThreadPoolExecutorです。これはしばらくの間そうでしたが、私が遭遇したここでの質問ではあまり報告されていません. いずれの場合も、Android のドキュメントはこちらです。文字通り、2番目の文のようです。

于 2013-10-25T17:12:59.307 に答える
0

onClick()問題は、UI スレッドで実行されることです。つまり、UI が再度更新される前にメソッド全体を終了する必要があるため、最後の番号に突然ジャンプします。それが、 を使用しても何も起こらない理由でもありますThread.Sleep()sleep()その場合、UI スレッドに適用されるため、アプリ全体がフリーズします。

TextView をカウントアップする場合は、AsyncTaskを使用する必要があります。Thread.sleep()にループと aを追加doInBackground()し、進行状況を公開して にテキストを設定しますonProgressUpdate()。リンクには、実際に役立つはずの良い例が含まれています。

于 2013-10-25T17:11:36.237 に答える