2016-04-27 8 views
0

、私は(TextViewのために例えばのsetText)非UIスレッドでいくつかのビューのプロパティを変更したい場合は、私はこれらのようなコード記述する必要があります:非UIスレッドがビュープロパティを変更できないのはなぜですか?アンドロイドで

runOnUiThread(new Runnable(){ 
    textView.setText("Hello world"); 
}); 

とC#での、私は、デリゲートを使用する必要がありますこれはより複雑である。

なぜ彼ら(フレームワーク)は、私たちが次のような内部コードでこれらのことをするのを助けないのですか?

void setText(string text){ 
    if(isInMainThread()){ 
     //direct set text 
    }else{ 
     post(new Runnable(){ 
     setText(text); 
     }); 
    } 
} 

フローはコーダによって制御する必要があるため非推奨のJavaスレッドの停止方法に似何らかの理由はありますか?

事前に感謝し、私の貧しい英語を許してください。

+0

すべてのUI描画に関連する作業は1スレッドで行われるため、UIを変更するコードをこのスレッドにプッシュする必要があります。それ以外の場合は並行性の問題が発生します – Bhargav

+0

私は同意します。しかし、なぜフレームワークがこれらのexraを実行するのに役立つのではないのですか?メインスレッドでは検出できず、それを記録して、メインスレッドでこれらのことを後で行います。 –

答えて

1

短い答え:Androidのシングルスレッドアーキテクチャのため、UIツールキットはスレッドセーフではありません。ここで

アプリケーション・コンポーネントが起動し、アプリケーションが実行されている任意の他のコンポーネントを持っていない場合はAndroid - Processes and Threads

は、Androidのシステムが持つアプリケーション用の新しいLinuxプロセスを開始Androidの公式ドキュメントからの完全な答えを見つけることができます単一の実行スレッド。デフォルトでは、同じアプリケーションのすべてのコンポーネントが同じプロセスとスレッド(「メイン」スレッドと呼ばれます)で実行されます。

さらに

Andoid UIツールキットは、スレッドセーフではありません。したがって、ワーカースレッドからUIを操作してはいけません。UIスレッドからすべての操作をユーザーインターフェイスに行う必要があります。

  1. 、はいUIスレッドの外
+1

スレッド作成者はなぜアンドロイドがシングルスレッドであるのか理解しています。なぜなら、彼が知りたいのは、 'TextView.setText'のようなメソッドが、その特定のメソッドがUIスレッドで実行されているかどうかをチェックします代わりに。コードスニペットのように彼は彼の質問に投稿しました – Bhargav

+0

上記の理由から、UIはスレッドセーフではありません。 –

1

からAndroidのUIツールキットにはアクセスしないでくださいUIスレッド

  • をふさがないでください。このように、Androidのシングルスレッドモデルに単純に2つのルールがあります私は同意する、クリエイターはそれを行うことができますが、おそらくそれはSOLID Androidアーキテクチャの設計から来た。

    SOLIDは頭字語で、オブジェクト指向プログラミングとデザインの5つの基本原則を表します。私の見解では、どのメソッドが呼び出されたかをview'dで確認した場合、違反します単一責任原則 - どのスレッドが使用されたかを確認する責任がありますか? IMHOしないでください。 )

    私が現在のアーキテクチャで知っている限り、setTextメソッドでテキストを変更すると、ビューはその状態が変更されたことを通知し、それを再描画するのはOSの責任ですが、正直言って、私はそれがどのように正確に処理されるかについての詳細はまだ分かっていません。

    さらに、このアプローチでは、Androidクリエイターはアプリケーション開発者にどのスレッドでどの操作が呼び出されたかを考えさせるようにしました。大きな計算タスクはUIアニメーションの一部であってはなりません。

  • +0

    あなたの答えに感謝します。 –

    +0

    @DaSqyStcようこそ –

    関連する問題