0

問題を以下の疑似コードに入れようとしました:

public class something extends Activity {

    // some buttons and text view declaration
    public TextView textViewSomethingStatus;

    on create() {
            textViewSomethingStatus = (TextView) findViewById(R.id.something);
            //Here at one point i have stated thread
             new specialThread().start();
    }

    // some methods


    class specialThreads extends Thread {

         public void run() {
          //after performing some task.
          textViewSomethingStatus.setText("hello world");//This gives me crash
          }    
     }
}

別のクラスからテキスト ボックスのテキストを更新しようとすると、クラッシュします。どうすればいいですか?Java と同様に、複数のクラスを拡張することはできません。

編集 :

E/AndroidRuntime( 605): android.view.ViewRootImpl$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

4

5 に答える 5

4
 public void run() {



//check some status of something here

runOnUiThread(new Runnable() {

            @Override
            public void run() {
                 textViewSomethingStatus.setText("hello world");//This will not give you crash now 

            }
        })

なんでそうなの ?

Android スレッドの概念についてお読みください。タイプミスを修正することを忘れないでください。onCreate()メソッド名oncreate()の代わりにonCreate();を書きました。yessetContentView(layout_id)も欠落していますonCreate()

于 2013-03-28T07:53:31.280 に答える
4

あなたspecialThreadssomethingクラス内にあるので、アクセスできます。それはエラーをスローするものであってはなりません(そこにアクセスできなかった場合、コンパイルエラー自体が表示されるためです)。

onCreate()エラーは、 を初期化する前に、 でコンテンツ ビューを設定するのを忘れたためですTextView

setContentView(R.layout.activity_main);

これは、Android 関連のエラーを修正するためのものです。この変更後に直面する可能性が高いスレッドの問題については、ここに投稿された他の回答を参照してください。

于 2013-03-28T07:52:41.320 に答える
2

これが「メイン」スレッドでない限り、別のスレッドから UI を更新することはできません。ただし、Androidでそれを行う方法はあります。ここで Handler を使用します

また、「クラッシュ」とは何か、つまりどのようなエラーが発生するのかを指定しない限り、それを判断するのは非常に困難です。

于 2013-03-28T07:52:41.940 に答える
1

スタックトレースがないと、正しいエラーを特定するのは困難ですが、UI スレッドでスレッドを実行する必要があると思います: そのサンプルコードを試してください:

something.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
                             textViewSomethingStatus.setText("hello world");//
        }
    });
于 2013-03-28T07:54:43.337 に答える
1

私もあなたが以前に抱えていた問題に直面しました.だからここにあります:


:(提案が気に入らない場合は、使用するすべてのものを static.ie.classes、variables などにしてみてください)


あなたができる最高のこと

BroadcastReceiverここに良いチュートリアルがあります。.

あなたが世話をする必要がある簡単なことのいくつか...

  • BroadcastReceiver(Activity 自体で)を拡張するクラスを作成します。

      private class RecvrPClass extends BroadcastReceiver {
    
    /**
     * 
     */
    public RecvrPClass() {
        // TODO Auto-generated constructor stub
    }
    
    /*
     * (non-Javadoc)
     * 
     * @see
     * android.content.BroadcastReceiver#onReceive(android.content.Context,
     * android.content.Intent)
     */
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub
        // Toast.makeText(arg0, "GOT HERE", Toast.LENGTH_LONG).show();
    //fetch whatver you need to do here ;refresh();
    
    }}
    
  • インスタンスを作成して登録する

     private BroadcastReceiver _refreshReceiver = new RecvrPClass();
    
    IntentFilter filter = new IntentFilter("SOME DESCRIPTION");
    
        this.registerReceiver(_refreshReceiver, filter);
    
  • SendBroadcastIntents実装を起動/呼び出す必要がある場所ならどこでも使用

     Intent inBiz = new Intent("SOME DESCRIPTION");
            sendBroadcast(inBiz);
    
于 2013-03-28T08:04:42.397 に答える