2017-02-15 41 views
0

如果ViewOnCreateView()(這是不是在UI線程從我的理解),操控(即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#如何實現字段訪問,它是否自動映射到setter方法?如果不是,則必須使用setter方法而不是直接訪問字段,因爲setText()不僅僅是更改字符串字段。

+0

'public String Text {get;組; }用於Xamarin TextView。 – samosaris

+0

如果在主線程上調用了每個片段的生命週期,那麼我應該可以在OnCreateView的ListView中設置TextView或SetItemChecked的文本,而不會出現問題,但是在某些情況下,我必須在UI線程上顯式執行這些語句(有時只有從OnResume()發佈)。 – samosaris

+0

他們沒有例外地從主線程調用。在每個生命週期方法中使用Looper.MyLooper()。Thread == MainLooper.Thread來檢查。來自官方xamarin-docs的 – CrowsNet

0

我無法解決代碼的細節問題,但在嘗試從UI線程更新TextView(或EditView)時,它會崩潰,但它應該顯示在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方法。最終我發現它只是在步入時才發生,而不是在離開時運行。

希望有人比我聰明很多,但同時,祝你好運!

相關問題