Androidでは、コンテンツ(コンテンツ)でビュー(アクティビティ/フラグメント)を更新する必要がありますか?データ/コンテンツを含むビューを更新するベストプラクティス?
TextView
はsがOnCreate()
が実行されている同じスレッドからテキストを設定しないでください」、正しいが、代わりにUIスレッドに文を掲載することにより行われる(UIスレッド上で設定MessageQueue
)?私のビューの設定データの
95%(TextViews
で、TabHosts
、Checkboxes
、等...)直接OnCreate()
(またはそれから呼び出される関数)とは、正常に動作しますが、私は実現で今はちょうどb/c私はそれが正しいことを意味するわけではありません(はい私は今ビットを取得しています。
ただし、UIスレッド上で実行されていることは、十分ではありません、私は予想通りRecordView
が更新されることを100%保証するためにOnResume()
から投稿する必要が見つけることです。
ショー以下のコードは、
UpdateView()
を呼び出すための2つのシナリオです。それは十分予想通りRecordView
は、人口データを表示する、またはこれを行うのより良い、より正確なおよび/または好ましい方法があることを確認するためにOnResume()
でUpdateView()
を呼び出すことですか?はまた、
_container
への冗長_thisView
のですか?です、それは
OnCreate()
表示されているのと同じRecordView
と呼ばれていたさRecordView
?RecordView
をOnCreate()
に膨らませてから返却する必要があるのはなぜですか?OnCreate()
が呼び出される前に、ランタイムによって自動的に実行されるべきではありません(これはFactoryパターンなのでしょうか?)
例コード:
public class RecordView : Fragment
{
private Bundle _bundle;
private ViewGroup _container;
private LayoutInflater _inflater;
ViewGroup _thisView;
TextView _tvTitle, _tvField1, _tvField2;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
{
base.OnCreateView(inflater, container, bundle);
_inflater = inflater;
_container = container;
_bundle = bundle;
Render();
return _thisView;
}
public override void Render()
{
_thisView = (ViewGroup) _inflater.Inflate(Resource.Layout.Record, _container, false);
_tvTitle = _thisView.FindViewById<TextView>(Resource.Id.tv_title);
_tvField1 = _thisView.FindViewById<TextView>(Resource.Id.tv_field_1);
_tvField2 = _thisView.FindViewById<TextView>(Resource.Id.tv_field_2);
// *A* SOMETIMES WORKS - Title & fields sometimes blank
UpdateView();
// *B* SOMETIMES WORKS - Title & fields sometimes blank
_thisView.Post(() => { UpdateView(); });
}
public override void OnResume()
{
base.OnResume();
// *C* SOMETIMES WORKS - Title & fields sometimes blank
UpdateView();
// *D* ALWAYS WORKS - Title & fields always display data as expected
_thisView.Post(() => { UpdateView(); });
}
private void UpdateView()
{
_tvTitle.Text = "Todo";
_tvField1.Text = "RTFM";
_tvField2.Text = "ASAP";
}
}
** 'OnResume() '**からのビューの更新は確かに信頼性は向上しましたが、かなり遅くなりました(この遅さは** OnCreateView()のコンテンツ設定に干渉していた可能性があります**)ビジーなレンダリングです)。しかし、ビューの複雑さにかかわらず、** OnResume()**によって導入されたこの遅延は一貫しているように見えます(関連するビューはすべて同じViewPagerのフラグメントです**)。この遅れをよく説明します)。 – samosaris