如果在 View
中操纵 TextView's
(即 OnCreateView()
文字) (根据我的理解不在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;
}
}
答案 0 :(得分:1)
OnCreateView()
,因此片段的每个生命周期方法都是如此。
实际上,如果没有从另一个线程显式调用,默认情况下,从入口点调用的每个方法都会在ui线程上运行。
不,如果您尝试从另一个线程更改视图,则会抛出未捕获的异常,从而导致应用程序崩溃。在这种情况下没有无声的失败。
另外,你不需要在OnCreateView()
中调用super,基本方法是空的。
我不知道C#如何实现字段访问,它是否自动映射到setter方法?如果没有,你必须使用setter方法而不是直接访问字段,因为setText()不仅仅是更改String字段。
答案 1 :(得分: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方法的时候。最终我发现它只是在踩踏时才发生,而不是在跑步时发生。
希望比我更聪明的人会权衡,但同时,祝你好运!