6-1 ViewModelProvider

博客提及ViewModel负责存储数据,LiveData负责通知数据改变,这些内容属于信息技术中前端开发或移动开发领域的数据处理相关知识。

当前

workPlaceViewModel = new ViewModelProvider(this
                    , new ViewModelProvider.NewInstanceFactory()).get(WarnWorkPlaceViewModel.class);

过时

ViewModelProviders.of(context).get(TaskViewModel.class)

//ViewModel 负责存储数据

public class WarnOrgViewModel extends ViewModel

//LiveData 负责通知数据改变

 

package com.st.statusbar.battery; import android.annotation.SuppressLint; import android.app.Application; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import androidx.databinding.DataBindingUtil; import androidx.lifecycle.ViewModelProvider; import com.st.base.utils.UserModeUtil; import com.st.data.DataManager; import com.st.data.ServiceType; import com.st.data.manager.StatusBarDataManager; import com.st.navigationbar.R; import com.st.navigationbar.databinding.StatusBarBatteryLayoutBinding; import com.st.statusbar.IconView; @SuppressLint("AppCompatCustomView") public class BatteryIconView extends IconView { private static final String TAG = "BatteryIconView"; private BatteryIconViewModel mBatteryIconViewModel; private StatusBarBatteryLayoutBinding mViewBinding; private Context mContext; private final float BATTERY_NORMAL = 0; private final int BATTERY_CHARGING = 1; private int batteryState; private boolean isChild; public BatteryIconView(Context context) { super(context); Log.i(TAG, "BatteryIconView: "); mContext = context; LayoutInflater.from(getContext()).inflate(R.layout.status_bar_battery_layout, this, true); } @Override public void initIconView() { super.initIconView(); mViewBinding = DataBindingUtil.bind(getChildAt(0)); mBatteryIconViewModel = ViewModelProvider.AndroidViewModelFactory .getInstance((Application) getContext().getApplicationContext()).create(BatteryIconViewModel.class); mViewBinding.setBatteryModel(mBatteryIconViewModel); mBatteryIconViewModel.setContext(mContext); initView(); initData(); } private void initView() { Log.i(TAG, "initView: "); isChild = UserModeUtil.getInstance().isChildMode(); } private void initData() { Log.i(TAG, "initData: "); StatusBarDataManager statusBarDataManager = (StatusBarDataManager) DataManager.getDataManager().getManager(ServiceType.STATUS); statusBarDataManager.setBatteryChangeListener(new StatusBarDataManager.BatteryChangeListener() { @Override public void onBatteryStateChanged(Integer state) { batteryState = state; mViewBinding.imBatteryIconCharging.setVisibility(state == BATTERY_CHARGING ? VISIBLE : GONE); if (isChild) { mViewBinding.imBatteryIconLevel.setImageResource(state == BATTERY_CHARGING ? R.drawable.status_icon_battery_level_charging_child : R.drawable.status_icon_battery_level_normal_child); } else { mViewBinding.imBatteryIconLevel.setImageResource(state == BATTERY_CHARGING ? R.drawable.status_icon_battery_level_charging : R.drawable.status_icon_battery_level_normal); } } @Override public void onBatteryLevelChanged(float level) { if (level < BATTERY_NORMAL) { level = BATTERY_NORMAL; } mViewBinding.imBatteryIconLevel.setImageLevel(calculateLevel(level)); } }); statusBarDataManager.updateBatteryStatus(); statusBarDataManager.updateBatteryLevel(); } private int calculateLevel(float value) { if (value <= 10) { return 0; } else if (value <= 20) { return 1; } else if (value <= 30) { return 2; } else if (value <= 40) { return 3; } else if (value <= 50) { return 4; } else if (value <= 60) { return 5; } else if (value <= 70) { return 6; } else if (value <= 80) { return 7; } else if (value <= 90) { return 8; } else { return 9; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override public void onDayNightModeChange(boolean isNight) { if (isChild) { mViewBinding.imBatteryIconLevel.setImageResource(batteryState == BATTERY_CHARGING ? R.drawable.status_icon_battery_level_charging_child : R.drawable.status_icon_battery_level_normal_child); } else { mViewBinding.imBatteryIconLevel.setImageResource(batteryState == BATTERY_CHARGING ? R.drawable.status_icon_battery_level_charging : R.drawable.status_icon_battery_level_normal); } mViewBinding.imBatteryIconCharging.setImageResource(R.mipmap.status_icon_battery_charging); } } ----- package com.st.statusbar.line; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; import android.app.Application; import android.content.Context; import androidx.lifecycle.ViewModelProvider; import androidx.test.core.app.ApplicationProvider; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockedStatic; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @Config(sdk = 29) public class LineViewTest { @Test public void testConstructor_inflatesLayoutAndSetsFocusable() { // Robolectric 自动提供真实 LayoutInflater 和资源系统 Context context = ApplicationProvider.getApplicationContext(); LineView view = new LineView(context); } @Test public void testInitIconView_initializesBindingAndViewModel() { Context context = ApplicationProvider.getApplicationContext(); try (MockedStatic<ViewModelProvider.AndroidViewModelFactory> factoryMock = mockStatic(ViewModelProvider.AndroidViewModelFactory.class)) { // 准备 mock LineViewModel mockViewModel = mock(LineViewModel.class); ViewModelProvider.AndroidViewModelFactory factory = mock(ViewModelProvider.AndroidViewModelFactory.class); factoryMock.when(() -> ViewModelProvider.AndroidViewModelFactory.getInstance(any(Application.class))) .thenReturn(factory); when(factory.create(LineViewModel.class)).thenReturn(mockViewModel); // 执行 LineView view = new LineView(context); view.initIconView(); // 验证 } } @Test public void testOnMeasure_callsSuper() { LineView view = new LineView(ApplicationProvider.getApplicationContext()); // Robolectric 会处理测量流程 view.measure(100, 100); // 只需确保不抛异常 view.onDayNightModeChange(true); } } 仿照下面的单元测试代码生成
08-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值