2017-02-15 7 views
0

Если View манипулируют (т.е. TextView's текст) в OnCreateView() (который не находится на UI потоке из моего понимания), это могло вызвать исключение в нем (если это утверждение, наконец, выполняет и Trys к обновить TextView, когда это может быть)?Можете ли обновить TextView от потока пользовательского интерфейса, вызывая в нем исключение?

Например, если заданный текст фактически не отображается на экране виджета, может произойти исключение, которое предотвратило бы его показ, который был поглощен потоком пользовательского интерфейса (или если исключение отображается в журнале независимо от того,)?

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(), базовый метод пуст.

Я не знаю, как C# реализует доступ к полям, автоматически ли он преобразуется в метод сеттера? Если нет, вы должны использовать метод setter вместо прямого доступа к полю, потому что setText() делает больше, чем просто изменение поля String.

+0

'public String Text {get; задавать; } 'для Xamarin TextView. – samosaris

+0

Если жизненный цикл каждого фрагмента был вызван в основном потоке, я должен иметь возможность установить текст TextView или SetItemChecked в ListView в OnCreateView без каких-либо проблем, однако в некоторых случаях я должен явно выполнять эти такие инструкции в потоке пользовательского интерфейса (а иногда и только если отправлено из OnResume()). – samosaris

+0

они не исключаются из основного потока. используйте Looper.MyLooper(). Thread == MainLooper.Thread в каждом методе жизненного цикла для проверки. – CrowsNet

0

Я не могу описать специфику вашего кода, но при попытке обновить TextView (или EditView) из потока пользовательского интерфейса он будет аварийно завершен, но он должен появиться в логарифме.

Вот пример обновления 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 
    }); 
} 

Что касается исключения происходит, но не показывая, я не могу с уверенностью сказать, но это возможно для отладчика отделяться, и это выглядит как приложение просто разбилось. Я прошел через это недавно, пройдя через него, и в какой-то момент все просто умерло. В моем случае это было, когда выходил из метода onReceive BroadcastReceiver. В конце концов я понял, что это произошло только при прохождении, а не при запуске.

Надеюсь, что кто-то намного умнее меня будет взвешивать, но в то же время удачи!

 Смежные вопросы

  • Нет связанных вопросов^_^