टुकड़ा से अद्यतन यूआई databinding का उपयोग कर बाध्यकारी

वोट
0

जाहिरा तौर पर वहाँ जो मैं स्पष्ट रूप से न प्राप्त की एंड्रॉयड में databainding करने के लिए एक विज्ञान है। मैं टुकड़ा या viewmodel जहां कुछ बातें सिर्फ काम दूसरों के उचित रूप में अक्रिय हैं के माध्यम से अद्यतन करने के विचारों से लड़ने समाप्त करते रहते हैं।

मैं एक प्रवेश बटन को निष्क्रिय अपने पाठ बदलने और एक अल्फा सेट करने के बाद अपने जब तक मैं तो मैं इसे वापस बदलने के एक API प्रतिक्रिया मिल क्लिक किया गया करना चाहते हैं। बहुत सीधा। इम कोड है कि वह अपने यह पहली बार बदल रहा है पर रोक के बाद से वापस बदल जाएगा शामिल नहीं है।

हालांकि यह मैं लिख रहा पर एक ही मुद्दा था, बटन कभी नहीं बदलता। टुकड़ा में पर्यवेक्षक बुलाया जाता है (लॉग में यह आदेश मैं उम्मीद यह बुलाया गया है करने के लिए पता चलता है), लेकिन यूआई सिर्फ does not अद्यतन। मैं फिर से एक एमुलेटर पर भाग गया और बार-बार पर्यवेक्षक लॉग नहीं करता जब तक बहुत बाद में और उसके बाद दृश्य की उम्मीद के रूप में अद्यतन, sorta दिखाई देते हैं। यह अद्यतन फ्लॉप जब मैं बटन पर क्लिक किया लेकिन कम से कम बटन एपीआई प्रतिक्रिया से पहले बदल वापस आ गया। मैं अनुप्रयोग बंद कर दिया और फिर से भाग गया यह और मूल मुद्दे से im वापस, अपने को अद्यतन करने के लिए नहीं।

SingleLiveEvent का उपयोग कर इम Googles वास्तुकला के नमूनों से असंशोधित https://github.com/android/architecture-samples/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com/example/android/architecture/ ब्लूप्रिंट / todoapp / SingleLiveEvent.java

activity_main_login <- अपनी एक टुकड़ा गतिविधि नहीं है, लेकिन मैं havent अभी तक यह पुनर्संशोधित। यह छोटा किया गया है, तो यह एक लेआउट कंटेनर के बिना काम नहीं हो सकता है।

<layout
    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>

    <data>
        <variable
            name=mainViewModel
            type=com.example.viewmodel.MainViewModel />
    </data>
    ...
    <Button
        android:id=@+id/btnLogin
        android:layout_width=135dp
        android:layout_height=47dp
        android:layout_marginLeft=8dp
        android:layout_marginRight=8dp
        android:layout_marginTop=16dp
        android:onClick=@{() -> mainViewModel.loginClicked()}
        android:text=@string/login
        android:textColor=#ffffff
        android:textStyle=bold
        android:background=#e05206
        app:layout_constraintLeft_toLeftOf=parent
        app:layout_constraintRight_toRightOf=parent
        app:layout_constraintTop_toBottomOf=@+id/fingerprintSwitch
        tools:layout_editor_absoluteX=101dp />
    ....
</layout>

MainFragment

ActivityMainLoginBinding binding;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.d(TAG, -> onCreateView() );
    super.onCreateView(inflater, container, savedInstanceState);

    mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);

    getLifecycle().addObserver(mainViewModel);

    binding = DataBindingUtil.inflate(inflater, R.layout.activity_main_login, container, false);
    mView = binding.getRoot();
    binding.setMainViewModel(mainViewModel);
    binding.setLifecycleOwner(this); // Yeah this is what I forgot last time...

    return mView;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    AppLog.d(TAG, -> onViewCreated() );
    super.onViewCreated(view, savedInstanceState);

    mainViewModel.getShowLoading().observe(getViewLifecycleOwner(), showLoading -> {
        AppLog.d(TAG, showLoading changed);
        this.loading = true;

        binding.btnLogin.setText(R.string.loggingIn);
        binding.btnLogin.setEnabled(false);
        binding.btnLogin.setAlpha(.5f);
    });
}

MainViewModel

private SingleLiveEvent<Boolean> showLoading = new SingleLiveEvent<>();

public void loginClicked() {
    Log.d(TAG, loginClicked());
    showLoading.setValue(true);
    login();
}

यहां बताया गया है लॉग जब इसे चलाता की तरह लग रही है और आप लॉगिन बटन पर क्लिक करें है ...

D/MainViewModel: loginClicked()
D/MainFragment: showLoading changed
D/MainViewModel: login()
13/01/2020 को 23:52
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
0

ऐसा नहीं है कि मैं Retrofit2 कोड है कि बनाया शामिल / API कॉल प्राप्त लेकिन यह सूत्रण से कोई लेना देना नहीं था। मैं विधि में तुल्यकालिक पुराना वापस संसाधन बुलाया लिपटे

new Handler().post(() -> { });

तो लॉगिन () अब इस तरह के और अधिक लग रहा है

private void login() {
    new Handler().post(() -> {
        // original retrofit call
        Thread t = new Thread(() -> authResponse = restApi.doAuthSync());
        t.start();

        // Joining thread so we wait for the response
        // I believe this to be the actual culprit of the problem
        try {
            t.join();
        } catch (InterruptedException e) {
            Log.e(TAG, e.getMessage());
        }

        // handle authResponse
        ...
    });
}

हालांकि API कॉल खुद अपनी ही धागे पर किया जाना चाहिए (और) था पूरे बात सिर्फ thread.join की वजह से यूआई धागा आयोजित सबसे अधिक संभावना है ()। यही कारण है कि databindings अद्यतन करने के लिए नहीं का कारण बना। यह RxJava का उपयोग कर सकता है समाधान हो गया है, लेकिन मैं नहीं लागू कर दिया है कि अभी तक और कोई सरल कार्य के लिए अपने आवश्यक नहीं।

15/01/2020 को 01:25
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more