92

私はこれをやろうとしました

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    t=new TextView(this); 

    t=(TextView)findViewById(R.id.TextView01); 
    t.setText("Step One: blast egg");

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    t.setText("Step Two: fry egg");

しかし、何らかの理由で、実行すると2番目のテキストのみが表示されます。Thread.sleep()メソッドのブロックと関係があるのではないかと思います。では、誰かがタイマーを「非同期に」実装する方法を教えてもらえますか?

ありがとう。

4

8 に答える 8

145

あなたのonCreate()方法にはいくつかの大きな欠陥があります:

1)アクティビティをonCreate 準備します-このメソッドが終了するまで、ここで行うことは何もユーザーに表示されません!たとえば、最後の変更のみが描画されてユーザーに表示されるため、TextViewここでのテキストを1回以上変更することはできません。

2)Androidプログラムは、デフォルトでは1つのスレッドでのみ実行されることに注意してください。したがって、UIを担当するメインスレッドで使用したり、使用しThread.sleep()たりしないでください。Thread.wait()(詳細については、 「アプリの応答性を維持する」をお読みください!)

アクティビティの初期化は次のとおりです。

  • 理由もなく、新しいTextViewオブジェクトを作成しますt
  • TextView後で変数でレイアウトを選択しますt
  • のテキストを設定します(ただし、注意してください。終了してアプリケーションのメインイベントループが実行された後にtのみ表示されます!) onCreate()
  • メソッド内で10秒間待機します。これは、すべてのUIアクティビティを停止し、確実にANRを強制するため、絶対に行わないでください(アプリケーションが応答しません。上記のリンクを参照してください)。onCreate
  • 次に、別のテキストを設定します。このテキストは、onCreate()メソッドが終了し、他のいくつかのアクティビティライフサイクルメソッドが処理されるとすぐに表示されます。

ソリューション:

  1. テキストを一度だけ設定しますonCreate()-これは、表示される最初のテキストである必要があります。

  2. とを作成しRunnableますHandler

    private final Runnable mUpdateUITimerTask = new Runnable() {
        public void run() {
            // do whatever you want to change here, like:
            t.setText("Second text to display!");
        }
    };
    private final Handler mHandler = new Handler();
    
  3. このランナブルをハンドラーとしてインストールしますonCreate()(ただし、以下の私のアドバイスを読んでください)。

    // run the mUpdateUITimerTask's run() method in 10 seconds from now
    mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
    

アドバイス:Activityのライフサイクルを知っていることを確認してください!あなたがそのようなことをするなら、これはあなたが最初に作成されたonCreate()ときにだけ起こります!Androidは、表示されていなくても、長期間存続する可能性があります。ユーザーがそれを再び「開始」すると(そしてそれがまだ存在している場合)、最初のテキストは表示されなくなります。ActivityActivity


=>常にハンドラーをインストールし、 !onResume()で無効にします。そうしないと、まったく表示されていないonPause()ときに「更新」が表示されます。Activityあなたの場合、最初のテキストが再びアクティブ化されたときに再び表示したい場合は、 !onResume()ではなく、に設定する必要があります。onCreate()

于 2010-02-24T12:18:27.700 に答える
46

この回答を android-discuss Google グループに投稿しました

ビューにテキストを追加して「ステップ 1: 爆風卵、ステップ 2: フライエッグ」と表示するだけの場合は、t.appendText("Step Two: fry egg"); 代わりに使用することを検討してください。t.setText("Step Two: fry egg");

の内容を完全に変更してTextView、起動時に「ステップ 1: 卵を割る」と表示され、後で「ステップ 2: 卵を揚げる」と表示されるようにする場合は、いつでも使用できます。

sadboy が与えた実行可能な例

幸運を

于 2010-02-20T06:17:32.783 に答える
15

新しいテキストビューの最初の行は不要です

t=new TextView(this); 

あなたはこれを行うことができます

TextView t = (TextView)findViewById(R.id.TextView01);

ここでスリープするバックグラウンドスレッドは一例ですが、これに適したタイマーがあると思います。代わりにタイマーを使用した良い例へのリンクは 次のとおりですhttp://android-developers.blogspot.com/2007/11/stitch-in-time.html

    Thread thr = new Thread(mTask);
    thr.start();
}

Runnable mTask = new Runnable() {
    public void run() {
        // just sleep for 30 seconds.
                    try {
                        Thread.sleep(3000);
                        runOnUiThread(done);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
        }
    };

    Runnable done = new Runnable() {
        public void run() {
                   // t.setText("done");
            }
        };
于 2010-02-19T23:01:08.960 に答える
6

@ユーザー264892

String 変数を使用する場合、"" の String を前に付けるか、明示的に CharSequence にキャストする必要があることがわかりました。

したがって、代わりに:

String Status = "Asking Server...";
txtStatus.setText(Status);

試す:

String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);

また:

String Status = "Asking Server...";    
txtStatus.setText("" + Status);

または、文字列は動的ではないため、さらに優れています:

txtStatus.setText("AskingServer...");
于 2011-08-20T15:02:35.043 に答える
3

あなたのアドバイスに従って、ハンドルとランナブルを使用して、「タイマー」を使用してTextViewのコンテンツを切り替え/変更しています。何らかの理由で、実行中、アプリは常に 2 番目のステップ (「ステップ 2: 卵を揚げる」) をスキップし、最後の (3 番目) のステップ (「ステップ 3: 卵を提供する」) のみを表示します。

TextView t; 
private String sText;

private Handler mHandler = new Handler();

private Runnable mWaitRunnable = new Runnable() {
    public void run() {
        t.setText(sText);
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    mMonster = BitmapFactory.decodeResource(getResources(),
            R.drawable.monster1);

    t=new TextView(this); 
    t=(TextView)findViewById(R.id.TextView01); 

    sText = "Step One: unpack egg";
    t.setText(sText);

    sText = "Step Two: fry egg";        
    mHandler.postDelayed(mWaitRunnable, 3000);

    sText = "Step three: serve egg";
    mHandler.postDelayed(mWaitRunnable, 4000);      
    ...
}
于 2010-02-23T05:50:35.497 に答える
0

テキストを sam textview に 2 回設定すると、最初に書かれたテキストが上書きされます。したがって、settext を 2 回目に使用するときは、次のように新しい文字列を追加するだけです。

textview.append("Step Two: fry egg");
于 2014-05-05T06:04:23.193 に答える