ash*_*007 6 android runnable android-databinding android-livedata
我有一个小问题,当我注释掉binding.setData(dataContainer); 在我的 Activity 中观察 Livedata 时,在onChanged中,我无法更新 UI,当我取消注释时,UI 会更新。 如果您觉得需要,请指导并进行一些代码审查。
我有一个 Runnable 每隔 x 秒重复运行一次。这是我在活动中观察到的 Livedata。
谢谢。
public class MainActivity extends AppCompatActivity {
TextOnScreen dataContainer;
ActivityMainBinding binding;
ViewModelClass modelClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
modelClass = ViewModelProviders.of(this).get(ViewModelClass.class);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
dataContainer = new TextOnScreen("hello");
binding.setData(dataContainer);
modelClass.getLiveData().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.e("TAG", "--onChanged--" + s);
dataContainer.onscreen.set(s);
// this line allows the textview to update
// other wise no change on UI is seen
binding.setData(dataContainer);
}
});
}
}
public class TextOnScreen {
public final ObservableField<String> onscreen=new ObservableField<>();
public TextOnScreen(String t) {
onscreen.set(t);
}
public String getOnscreen() {
return onscreen.get();
}
public void setOnscreen(String onscreen) {
this.onscreen.set(onscreen);
}
}
public class ViewModelClass extends ViewModel{
private MutableLiveData<String> liveData;
public ViewModelClass() {
ModelClass modelClass = new ModelClass();
liveData= modelClass.generateName();
}
public LiveData<String> getLiveData() {
return liveData;
}
}
public class ModelClass {
MutableLiveData<String > data =new MutableLiveData<>();
MutableLiveData<String> generateName(){
final android.os.Handler handler=new android.os.Handler();
Runnable runnable=new Runnable() {
@Override
public void run() {
data.setValue(data.getValue()+"*");
handler.postDelayed(this,1000);
}
};
handler.postDelayed(runnable,2000);
return data;
}
}
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="data"
type="dsfa.drish.com.livedatasample.TextOnScreen"/>
</data>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.onscreen}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
fuk*_*uda 12
通过删除TextOnScreen并将MainActivity修改为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewModelClass modelClass = ViewModelProviders.of(this).get(ViewModelClass.class);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setData(modelClass); // <-- set the ViewModel to be binded
binding.setLifecycleOwner(this); // <-- this enables MutableLiveData to be update on your UI
modelClass.getLiveData().setValue("hello");
modelClass.getLiveData().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.e("TAG", "--onChanged--" + s);
}
});
}
Run Code Online (Sandbox Code Playgroud)
并在您的activity_main.xml 上:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="data"
type="com.rafaelfukuda.stackoverflow.ViewModelClass"/>
</data>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.liveData}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
其他代码改进:
我会保持我的模型非常简单(没有 MutableLiveData 属性的 POJO)并将generateName移动到 ViewModel。这将保持适当的MVVM结构,并且将来很容易理解和扩展您的代码。
结果:
| 归档时间: |
|
| 查看次数: |
11461 次 |
| 最近记录: |