标签: android-mvvm

如何检查权限是否授予ViewModel?

我需要询问联系人的权限,当应用程序启动时,我要问,在ViewModel部分,我需要调用需要权限的方法。我需要检查权限是否由用户授予,然后再调用,但是要检查权限,我需要具有访问活动。而在我的ViewModel中,我没有对Activity的引用,也不想拥有,如何解决该问题?

permissions android android-activity android-mvvm

5
推荐指数
2
解决办法
3170
查看次数

如果存在则更新记录,否则在Room中插入新记录

我是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)

android android-mvvm rx-java2 android-room

5
推荐指数
1
解决办法
2958
查看次数

如何使用数据绑定请求或删除对edittext的关注

我正在学习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)

android mvvm android-databinding android-mvvm

5
推荐指数
2
解决办法
2117
查看次数

Android Architecture Components(MVVM)-使用存储库模式处理远程和本地数据的理想方法

我浏览了许多可用于新架构组件的示例代码,但是在设置项目时仍然遇到一些问题。

我需要从远程服务中获取数据并将其保存到会议室数据库中。我希望我的视图仅观察一个实时数据列表。我的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

5
推荐指数
1
解决办法
1401
查看次数

ViewModelProvider.Factory和ViewModelProvider.NewInstanceFactory有什么区别?

我目前正在将我的项目架构从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)

android mvvm android-mvvm android-architecture-components

5
推荐指数
1
解决办法
988
查看次数

如何使用 ViewModel 在活动之间发送数据

我使用相同的过程在片段之间发送数据并且它可以工作,但现在我没有在接收器活动中获取数据。当我点击提交按钮时,甚至日志消息标签也没有显示。我检查了发件人活动日志消息,它显示数据但无法在接收方活动中获取这些数据。

请帮我获取数据。谢谢!!

在发送活动的日志消息中获取数据

接收器活动,甚至不显示日志消息的标签

视图模型类:

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)

android android-mvvm android-viewmodel

5
推荐指数
1
解决办法
6588
查看次数

无法获取提供者androidx.lifecycle.ProcessLifecycleOwnerInitializr

在运行具有依赖关系的应用程序'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)

android viewmodel android-mvvm androidx

5
推荐指数
2
解决办法
1386
查看次数

您应该将 coroutineScope 作为函数参数传递吗?

我正在试验协程,但不确定是否将 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

5
推荐指数
2
解决办法
2214
查看次数

使用 dagger2 在多个片段中使用相同的视图模型实例

我在我的项目中只使用 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)

android viewmodel android-fragments dagger-2 android-mvvm

5
推荐指数
1
解决办法
4209
查看次数

RxJava + Websocket - 如何将 Observable 添加到 Websocket 侦听器?

我有一个ViewModel正在观察ObservableMainRepo班级中的 RxJava 。我试图让我WebsocketListenerMainRepo课堂上发出事件,但我不确定如何这样做。

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 rx-java okhttp android-mvvm rx-java2

5
推荐指数
1
解决办法
178
查看次数