3

これは私の最初のアプリの 1 つで、何をすればよいかわかりません。

package com.example.stopuhr;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

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

    }

    public int hs, sek, min;
    public boolean running = false;
    public String mode = "gestoppt";


    public void setLabelText(){
        TextView textView1 = (TextView)findViewById(R.id.textView1);
        String ht = "";
        String st = "";
        String mt = "";

        if (hs<10){
            ht = "0" + hs;
        }else{
            ht = String.valueOf(hs);
        }

        if (sek<10){
            st = "0" + sek;
        }else{
            st = String.valueOf(sek);
        }

        if (min<10){
            mt = "0" + min;
        }else{
            mt = String.valueOf(min);
        }

        textView1.setText(mt + " : " + st + " : " + ht);
    }



    public void onClickStart (View view){
        Thread timer = new Thread(){

これが最初のエラーです この行に複数のマーカー - 構文エラー、「}」を挿入して ClassBody を完成 - 構文エラー、「;」を挿入 ConstructorDeclaration を完了する - 構文エラー、「;」を挿入 BlockStatements を完成させます - メソッドの戻り値の型がありません - 構文エラーです。")" を挿入して ConstructorDeclaration を完成させてください

            runOnUiThread(new Runnable() {

            public void run(){

                if (mode.equals("gestoppt")){
                    running = true;
                    mode = "läuft";

                    while (running){
                        try{Thread.sleep(9);}
                        catch(Exception e){}

                        if(hs<=99){
                            hs++;
                        }else{
                            hs = 0;
                            if(sek<=59){
                                sek++;
                            }else{
                                sek = 0;
                            }
                            if(min<=99){
                                min++;
                            }else{
                                min = 0;
                            }
                        }
                    }
                    setLabelText();
                }

            }

2 番目の間違いは次のとおりです。トークン "}" の構文エラー、MethodHeaderName が予期されていました。このエラーをどう処理すればよいかわかりません。

            });

        };
        timer.start();


    }


    public void onClickStop (View view){
        if (mode.equals("läuft"));
        running = false;
        mode = "gestoppt";
    }

    public void onClickReset (View view){
        if(mode.equals("gestoppt")){
            hs = 0;
            sek = 0;
            min = 0;
            setLabelText();
        }
    }

}

ご協力ありがとうございました。

4

3 に答える 3

3

コードには次のものがあります。

public void onClickStart (View view){
    Thread timer = new Thread(){
        runOnUiThread(new Runnable() {
            public void run() {
                ...
            }
        });
    };
}

ここでの問題は、呼び出しがrunOnUiThreadメソッドではなく、クラス内にあることです。一般に、スレッド、runnable、および runOnUi と混同されているようです。runUI スレッドでそのメソッドを呼び出したい場合は、新しいスレッドを開始しても意味がありません。UI スレッドで行う必要があるのは、ラベル テキストを更新することだけです。ロジックを調べずに、構文エラーを修正する 1 つの方法は次のとおりです。

public void onClickStart (View view) {
    Thread timer = new Thread(){
        public void run() {
            ...
            runOnUiThread(new Runnable() {
                public void run() {
                    setLabelText();
                }
        }
    };
    timer.start();
}

最後に、これはこの種のロジックを実行する最良の方法ではないことに注意してください。AsyncTaskwithonProgressUpdateは、私にははるかに優れたソリューションのようです。

于 2013-08-19T14:51:17.347 に答える
0

MainActivity機能をクラスのメソッドに入れる方が良いと思います:

private void doMyOperation() {
   runOnUiThread(.....);
}

スレッドでそのメソッドを呼び出します。

于 2013-08-19T15:07:26.537 に答える