0

textView (tvCurrentBeat と呼ばれる) を持っていますが、setText() を使用しようとすると、起動時にアプリがクラッシュします。このコード行を削除すると、アプリは正常に動作します。

XML コード:

<TextView
      android:id="@+id/tvCurrentBeat"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignLeft="@+id/ivDividerMiddle"
      android:layout_below="@+id/ivDividerMiddle"
      android:layout_marginTop="10dp"
      android:text="Current Beat:"
      android:textColor="#ffffff"
      android:textAppearance="?android:attr/textAppearanceLarge" />

変数の初期化:

tvCurrentBeat = (TextView) findViewById(R.id.tvCurrentBeat);

その他のコード:

new Thread() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();

            while (true) {
                if (metronomeOn) {
                    metronome = new Metronome(10000);
                    metronome.play();
                    metronomeOn = false;
                }
                tvCurrentBeat.setText("Current Beat: ");
            }
        }

    }.start();

これは、このテキストビューに影響を与えるすべてのコードです。何か案は?

4

3 に答える 3

2

UIバックグラウンドでを更新しようとしていますThread。それはノーノーです。runOnUiThread()またはAsyncTaskまたはHandlerのいずれかを使用する必要があります

何かのようなもの

 runOnUiThread(new Runnable() {
        public void run()
        {
           tvCurrentBeat.setText("Current Beat: ");
        }
    });
}

あなたも読みたいと思うかもしれません痛みのないスレッディング

于 2013-08-02T23:34:44.147 に答える
2

これは、このテキストビューに影響を与えるすべてのコードです。何か案は?

Android では、元のスレッドからのみ UI 要素を操作できるという制限があります (@Delyan がコメントで指摘したように)。

メイン (UI) スレッドと同期されず、UI の更新を許可しないワーカー (バックグラウンド) スレッドを作成しました (セキュリティと円滑な実行の理由から)

目標を達成するには、いくつかの選択肢があります。

  • runOnUiThread() の使用法
  • ハンドラ
  • 非同期タスク

言及されたすべての構造は同期されているか、UI スレッドと同期され、UI で操作できるメソッドを提供します。

于 2013-08-02T23:37:40.240 に答える
1

バックグラウンド スレッドから UI 要素を更新することはできません。Runnable を作成し、それを介して更新する必要があります。これを行うには他にもオプションがありますが、これは私が最も頻繁に使用する傾向があるものです。

次に例を示します。

private Handler threadHandler = new Handler();

// ...

while (true) {
    if (metronomeOn) {
        metronome = new Metronome(10000);
        metronome.play();
        metronomeOn = false;
    }
    threadHandler.post(updateRunnable);
}

// ...

final Runnable updateRunnable = new Runnable() {
    public void run() {
        tvCurrentBeat.setText("Current Beat: ");
    }
}; 

runOnUiThread()別の方法は、メイン スレッドで実行するだけのものを使用することです。

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();

        while (true) {
            if (metronomeOn) {
                metronome = new Metronome(10000);
                metronome.play();
                metronomeOn = false;
            }
            tvCurrentBeat.setText("Current Beat: ");
        }
    }
}.start();
于 2013-08-02T23:36:06.550 に答える