可以从UI线程更新TextView会导致异常吗?

时间:2017-02-15 17:32:04

标签: android xamarin.android

如果在 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;
    }   
}

2 个答案:

答案 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方法的时候。最终我发现它只是在踩踏时才发生,而不是在跑步时发生。

希望比我更聪明的人会权衡,但同时,祝你好运!

相关问题