我需要询问联系人的权限,当应用程序启动时,我要问,在ViewModel部分,我需要调用需要权限的方法。我需要检查权限是否由用户授予,然后再调用,但是要检查权限,我需要具有访问活动。而在我的ViewModel中,我没有对Activity的引用,也不想拥有,如何解决该问题?
我是Room,Rxjava和其他Android架构组件的新手.我正在尝试更新/插入2条记录(如果行已经存在,请更新它.否则插入一个新行.)我试图按照以下方式进行操作.但是,我没有工作.
GameActivity:
public class GameActivity extends AppCompatActivity {
...
public void onGameWinnerChanged(Player winner) {
mDisposable.add(gameViewModel.updateDb(winner)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> Log.e("Success!!!", "updated records")
, throwable -> {
throwable.printStackTrace();
}));
}
}
Run Code Online (Sandbox Code Playgroud)
GameViewModel:
public class GameViewModel extends ViewModel {
...
public Completable updateDb(Player winner) {
return Completable.fromAction(() -> {
updateWinner(winner);
Player loser = game.player1 == winner ? game.player2 : game.player1;
updateLoser(loser);
});
}
private void updateLoser(Player loser) {
User user = userDataSource.getSingleRecordFromName(loser.name);
if (user != null) {
user.loss++;
userDataSource.updateRecord(user);
} else { …Run Code Online (Sandbox Code Playgroud) 我正在学习mvvm结构,也正在使用mvvm结构制作应用data binding。
现在,我想做的是,我想从sharedpreference中获取一个用户,如果成功获取用户,则将usr的名称设置为edittext1。在这种情况下,我想要求重点放在edittext2上。
如何使用数据绑定来实现?(以这种方式,我不必使用活动。该工作应仅使用视图模型和xml完成。)
我已经尝试使用以下方式。
StartGameViewModel
public class StartGameViewModel extends ViewModel {
public static String TAG="StartGameViewModel";
private Preference<User> preference;
public ObservableField<String> player1Name=new ObservableField<>("");
public ObservableField<String> player2Name=new ObservableField<>("");
public ObservableBoolean shouldRequestFocus=new ObservableBoolean(false);
StartGameViewModel(Preference preference){
this.preference=preference;
}
public void getPreference() {
preference.get(Constants.CURRENT_USER,User.class)
.subscribe(new Observer<User>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(User user) {
player1Name.set(user.name);
shouldRequestFocus.set(true);
}
@Override
public void onError(Throwable e) {
Log.i(TAG,"user is logged out");
} …Run Code Online (Sandbox Code Playgroud) 我浏览了许多可用于新架构组件的示例代码,但是在设置项目时仍然遇到一些问题。
我需要从远程服务中获取数据并将其保存到会议室数据库中。我希望我的视图仅观察一个实时数据列表。我的AppRepository处理RemoteRepository和LocalRepository。远程存储库具有fetchMovies()方法,该方法从Web服务接收电影列表。我想将此列表保存在会议室数据库中,目前我的RemoteRepository类正在执行此操作。
public void fetchMovieFromRemote(int page){
movieService.fetchPopularMovies(ApiConstants.BASE_URL, page).enqueue(new Callback<List<Movie>>() {
@Override
public void onResponse(Call<List<Movie>> call, Response<List<Movie>> response) {
int statusCode = response.code();
if (statusCode == 200){
mLocalRepository.insert(response.body());
}
}
@Override
public void onFailure(Call<List<Movie>> call, Throwable t) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,理想情况下,远程存储库和本地存储库应独立,并且此工作应由AppRepository类完成。一种方法是使用回调,但我想使用实时数据来实现。fetchMovieFromRemote(int page)方法是否应该为此返回一个实时数据,但是在那种情况下,如何在我的viewmodel中处理它,该模型目前具有房间返回的电影列表的实时数据。
@Query("SELECT * from movie ORDER BY id ASC")
LiveData<List<Movie>> getAllWords();
Run Code Online (Sandbox Code Playgroud)
我是MVVM的新手,请引导我了解此架构的理想方法。
android-mvvm android-room android-livedata android-architecture-components
我目前正在将我的项目架构从MVP转换为MVVM。当我在处理它时,我发现有些东西使我感到困惑:
在ioschedScheduleViewModelFactory.kt项目中,工厂实现ViewModelProvider.Factory:
class ScheduleViewModelFactory(
private val userEventRepository:DefaultSessionAndUserEventRepository
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ScheduleViewModel::class.java)) {
return ScheduleViewModel(LoadUserSessionsByDayUseCase(userEventRepository)) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
Run Code Online (Sandbox Code Playgroud)
在codelab的DetailViewModelFactory.java Sunshine项目中,工厂扩展了ViewModelProvider.NewInstanceFactory:
public class DetailViewModelFactory extends ViewModelProvider.NewInstanceFactory {
private final SunshineRepository mRepository;
private final Date mDate;
public DetailViewModelFactory(SunshineRepository repository, Date date) {
this.mRepository = repository;
this.mDate = date;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) { …Run Code Online (Sandbox Code Playgroud) 我使用相同的过程在片段之间发送数据并且它可以工作,但现在我没有在接收器活动中获取数据。当我点击提交按钮时,甚至日志消息标签也没有显示。我检查了发件人活动日志消息,它显示数据但无法在接收方活动中获取这些数据。
请帮我获取数据。谢谢!!
视图模型类:
public class ViewModelClass extends ViewModel {
private final MutableLiveData message = new MutableLiveData();
public void setMessage(HomeModelClass data){
message.setValue(data);
}
public MutableLiveData getMessage() {
return message;
}
}
Run Code Online (Sandbox Code Playgroud)
发件人活动:
public class EditHomeData extends AppCompatActivity {
private ViewModelClass viewModelClass;
HomeModelClass homeModelClassData = new HomeModelClass();
@Override
protected void onCreate(Bundle savedInsatancestate) {
super.onCreate(savedInsatancestate);
setContentView(R.layout.first_page);
viewModelClass = ViewModelProviders.of(this).get(ViewModelClass.class);
setValues();
});
public void setValues() {
if (yes.isChecked()) {
rent_value = String.valueOf(1);
} else if (no.isChecked()) {
rent_value = String.valueOf(0);
}
homeModelClassData.setWard_id(ward_id + ""); …Run Code Online (Sandbox Code Playgroud) 在运行具有依赖关系的应用程序'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03'并'androidx.lifecycle:lifecycle-viewmodel:2.1.0-alpha03'在具有Android 4.4的设备上运行时出错。
在Android 6上的设备上正常工作
应用因错误而崩溃
java.lang.RuntimeException: Unable to get provider androidx.lifecycle.ProcessLifecycleOwnerInitializer: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwnerInitializer" on path: DexPathList[[zip file "/data/app/**********.apk"],nativeLibraryDirectories=[/data/app-lib/***********, /vendor/lib, /system/lib]]
at android.app.ActivityThread.installProvider(ActivityThread.java:5052)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4623)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4563)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1402)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5333)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwnerInitializer" on path: DexPathList[[zip file "/data/app/**********.apk"],nativeLibraryDirectories=[/data/app-lib/********, /vendor/lib, /system/lib]]
Run Code Online (Sandbox Code Playgroud) 我正在试验协程,但不确定是否将 coroutineScope 传递给普通的 Kotlin 用例。这种方法会造成内存泄漏吗?
假设我们正在 VM 中初始化我们的 UseCase 并尝试传递viewModelScope:
class UploadUseCase(private val imagesPreparingForUploadUseCase: ImagesPreparingForUploadUseCase){
fun execute(coroutineScope: CoroutineScope, bitmap: Bitmap) {
coroutineScope.launch {
val resizedBitmap = withContext(Dispatchers.IO) {
imagesPreparingForUploadUseCase.getResizedBitmap(bitmap, MAX_SIZE)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
是安全码吗?如果我在 VM 中声明这个确切的代码没有区别吗?如果不是,那意味着我可以将 coroutineScope 作为构造函数参数传递......现在我最初认为我应该通过以下方式创建我的 execute 方法:
fun CoroutineScope.execute(bitmap: Bitmap) {
launch {
val resizedBitmap = withContext(Dispatchers.IO) {
imagesPreparingForUploadUseCase.getResizedBitmap(bitmap, MAX_SIZE)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我们使用扩展函数以便方法使用父协程范围。这意味着,我不需要将 coroutineScope 作为参数传递,只需更改方法即可使用扩展函数。
但是,令我惊讶的是,VM 看不到此方法可用!为什么这个方法不能从VM调用?
这在 VM 中标记为红色:
private fun uploadPhoto(bitmap: Bitmap, isImageUploaded: Boolean) {
prepareDataForUploadingUseCase.execute(bitmap)
}
Run Code Online (Sandbox Code Playgroud)
这在 …
kotlin android-mvvm kotlin-coroutines kotlin-coroutines-flow
我在我的项目中只使用 dagger2 (不是 dagger-android)。使用多重绑定注入 ViewModel 工作正常。但是以前没有 dagger2 有一个问题,我在多个片段的活动中使用了相同的视图模型实例(使用 fragment-ktx 方法 activityViewModels()),但现在由于dagger2 正在注入视图模型,它总是提供新实例(在每个片段的视图模型的每个片段中使用 hashCode 检查,这只是使用 viewmodel 中断了片段之间的通信。
片段和视图模型代码如下:
class MyFragment: Fragment() {
@Inject lateinit var chartViewModel: ChartViewModel
override fun onAttach(context: Context) {
super.onAttach(context)
(activity?.application as MyApp).appComponent.inject(this)
}
}
//-----ChartViewModel class-----
class ChartViewModel @Inject constructor(private val repository: ChartRepository) : BaseViewModel() {
//live data code...
}
Run Code Online (Sandbox Code Playgroud)
这是视图模型依赖注入的代码:
//-----ViewModelKey class-----
@MapKey
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
internal annotation class ViewModelKey(val value: KClass<out ViewModel>)
//-----ViewModelFactory class------
@Singleton
@Suppress("UNCHECKED_CAST")
class ViewModelFactory
@Inject constructor( …Run Code Online (Sandbox Code Playgroud) 我有一个ViewModel正在观察Observable我MainRepo班级中的 RxJava 。我试图让我WebsocketListener在MainRepo课堂上发出事件,但我不确定如何这样做。
MainRepo 类:
private WebSocket ws;
public void createWsConnection() {
Request request = new Request.Builder()
.url(Constants.WEBSOCKET_ENDPOINT)
.addHeader(Constants.WEBSOCKET_HEADERS_KEY, Constants.USER_ID)
.build();
OkHttpClient client = new OkHttpClient
.Builder()
.pingInterval(30, TimeUnit.SECONDS)
.build();
this.ws = client.newWebSocket(request, webSocketListener);
}
Run Code Online (Sandbox Code Playgroud)
这是我感到困惑的地方。我不知道如何将 websocket 与 RxJava observable 一起使用。
public Observable<String> createListener(){
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> emitter) {
//I don't know what to put here in order to emit messages
//back to my …Run Code Online (Sandbox Code Playgroud) android-mvvm ×10
android ×8
android-architecture-components ×2
android-room ×2
mvvm ×2
rx-java2 ×2
viewmodel ×2
androidx ×1
dagger-2 ×1
kotlin ×1
okhttp ×1
permissions ×1
rx-java ×1