2017-02-15 10 views
0

Viewは、この文は最終的にに実行し、trysとき、それは(それに例外を引き起こす可能性があります(私の理解からUIスレッドではありません)OnCreateView()、(すなわち、TextView'sテキスト)を操作した場合それが更新される場合はいつでもTextViewを更新します)。UIスレッドからTextViewを更新すると例外が発生しますか?

たとえば、設定されたテキストが実際に画面ウィジェットに表示されない場合、例外が発生してUIスレッドが食べたものが表示されなくなる可能性があります(例外に関係なく、 )?

public class RecordView : Fragment 
{ 
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
    { 
     base.OnCreateView(inflater, container, bundle); 

     ViewGroup thisView = (ViewGroup) inflater.Inflate(Resource.Layout.Record, container, false); 

     TextView tvData = thisView.FindViewById<TextView>(Resource.Id.tv_data); 

     tvData.Text = "can this cause exception in UI thread?"; 

     return thisView; 
    } 
} 
+1

はい、可能です。特にフラグメントで作業する場合。 – Submersed

答えて

1

OnCreateView()常にメインスレッドで呼び出され、その断片のすべてのライフサイクルメソッドです。 実際には、エントリポイントから呼び出されたすべてのメソッドは、別のスレッドから明示的に呼び出されなければ、デフォルトでuiスレッドで実行されます。

いいえ、別のスレッドからビューを変更しようとすると、キャッチされない例外がスローされ、アプリケーションがクラッシュします。この場合、静かな失敗はありません。

また、OnCreateView()でsuperを呼び出す必要はなく、基本メソッドは空です。

C#がフィールドアクセスをどのように実装しているのかわかりませんが、それは自動的にセッターメソッドにマップされますか? setText()は単に文字列フィールドを変更するだけではないので、フィールドに直接アクセスする代わりにsetterメソッドを使用する必要があります。

+0

'public String Text {get;セット; } 'Xamarin TextViewのために。 – samosaris

+0

すべてのフラグメントのライフサイクルがメインスレッドで呼び出された場合、OnCreateViewのListViewでTextViewまたはSetItemCheckedのテキストを問題なく設定できるはずですが、場合によってはこれらのステートメントをUIスレッドで明示的に実行する必要があります(そして時にはOnResume()から投稿された場​​合のみ)。 – samosaris

+0

これらは例外なくメインスレッドから呼び出されます。 Looper.MyLooper()を使用します。スレッド== MainLooper.Threadは、チェックするライフサイクルの各メソッドにあります。 – CrowsNet

0

あなたのコードの詳細は扱えませんが、TextView(またはEditView)をUIスレッドから更新しようとするとクラッシュしますが、それはlogcatに表示されるはずです。

ここでは、別のスレッドからTextViewを更新する例を示します。

public void addLine(String line){   //line is the text being passed in 

    final String msg = line;    //this is critical! 
    runOnUiThread(new Runnable(){ 
     @Override 
     public void run() { 
      rcvd.append("\n" + msg);  //rcvd is a TextView and we're just 
     }         //adding a line of text 
    }); 
} 

は、例外が発生したが表示されないとして、私は確信を持って言うことはできませんが、デバッガがデタッチすることが可能であり、あなたのアプリがクラッシュしように見えます。私はこれを最近踏み出していましたが、ある時点ですべてがちょうど死んでしまったのです。私の場合は、BroadcastReceiverのonReceiveメソッドからステップアウトしていました。最終的に私はそれが踏み出す間に起こったことだけを考え出しました。

私よりもはるかに賢い誰かが体重を増やしてくれることを願っていますが、幸運にも幸いです!

関連する問題