日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

本文介紹了如何在Java for Android中修改新創(chuàng)建的監(jiān)聽(tīng)器中的外部布爾值的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

我有一個(gè)Android片段類,它有一個(gè)在單擊按鈕后在外部Firebase數(shù)據(jù)庫(kù)上寫入內(nèi)容的方法。

public class FR_Fragment extends Fragment implements View.OnClickListener {

    public void onClick(View view) {
        boolean writingSuccessfull = false;
        boolean writingNotSuccessfull = false;
        firebase_DB.child(id).setValue(currentOrder).addOnCompleteListener(new OnCompleteListener<Void>() {

            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    writingSuccessfull = true;
                    writingNotSuccessfull = false;
                    Log.e("dbTAG",  "Data successfully written.");
                }
                else {
                    writingSuccessfull = false;
                    writingNotSuccessfull = true;
                    Log.e("dbTAG", task.getException().getMessage());
                }
            }
        });
    }
}

但是,我不知何故無(wú)法訪問(wèn)我在OnCompleteListener的onClick方法中定義的布爾變量writingSuccessfullwritingNotSuccessfull。在顯示的代碼中,我得到了一個(gè)錯(cuò)誤&變量‘WritingSuccessFull’是從內(nèi)部類內(nèi)部訪問(wèn)的,需要是最終的或有效的最終的

當(dāng)我讓Android Studio解決此問(wèn)題時(shí),代碼如下所示:

public class FR_Fragment extends Fragment implements View.OnClickListener {

    public void onClick(View view) {
        final boolean[] writingSuccessfull = { false };
        final boolean[] writingNotSuccessfull = { false };
        firebase_DB.child(id).setValue(currentOrder).addOnCompleteListener(new OnCompleteListener<Void>() {

            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    writingSuccessfull[0] = true;
                    writingNotSuccessfull[0] = false
                    Log.e("dbTAG",  "Data successfully written.");
                }
                else {
                    writingSuccessfull[0] = false;
                    writingNotSuccessfull[0] = true
                    Log.e("dbTAG", task.getException().getMessage());
                }
            }
        });
    }
}

現(xiàn)在我可以執(zhí)行代碼了,但是布爾值不會(huì)更改,即使執(zhí)行了偵聽(tīng)器中的代碼。我也嘗試了一下,在布爾變量前沒(méi)有加上&最終&。但這并沒(méi)有改變?nèi)魏问虑椤N也荒苄薷拇吮O(jiān)聽(tīng)程序中的布爾變量。但這是我需要做的事情,因?yàn)槲蚁胫罃?shù)據(jù)是否已成功寫入數(shù)據(jù)庫(kù)。

知道我為什么會(huì)遇到這個(gè)問(wèn)題嗎?如何解決它?我將感謝您的每條評(píng)論。

更新:以下是更新后的代碼,其中包含Volatile和AericBoolas:

public class FR_Fragment extends Fragment implements View.OnClickListener {
    private volatile AtomicBoolean writingOrderToTheDatabaseWasSuccessful;
    private volatile AtomicBoolean writingOrderToTheDatabaseWasNotSuccessful;
...
public void onClick(View view) {

        int internalCounterAttempsWriteDataInTheFBDatabase =0;
        writingOrderToTheDatabaseWasSuccessful = new AtomicBoolean (false);
        writingOrderToTheDatabaseWasNotSuccessful = new AtomicBoolean (false);


        while(writingOrderToTheDatabaseWasSuccessful.get() == false && writingOrderToTheDatabaseWasNotSuccessful.get()==false) {
            internalCounterAttempsWriteDataInTheFBDatabase++;
            Log.e("LogTag", "internalCounterAttempsWriteDataInTheFBDatabase: " +internalCounterAttempsWriteDataInTheFBDatabase );
            Log.e("LogTag", "writingOrderToTheDatabaseWasSuccessful: " + writingOrderToTheDatabaseWasSuccessful.get());
            Log.e("LogTag", "writingOrderToTheDatabaseWasNotSuccessful: " + writingOrderToTheDatabaseWasNotSuccessful.get());


            DatabaseReference rootRef = FirebaseDatabase.getInstance("https://drink-server-db-default-rtdb.europe-west1.firebasedatabase.app").getReference();
            DatabaseReference ordersRef = rootRef.child("orders");
            String id =...;
            FirebaseDBItem_Order currentOrder = ...;

            ordersRef.child(id).setValue(currentOrder).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                 if (task.isSuccessful()) {
                      writingOrderToTheDatabaseWasSuccessful.set(true);
                      writingOrderToTheDatabaseWasNotSuccessful.set(false);
                      Log.e("dbTAG",  "Data successfully written.");
                      Log.e("LogTag", "Listener: writingOrderToTheDatabaseWasSuccessful: " + writingOrderToTheDatabaseWasSuccessful.get());
                      Log.e("LogTag", "Listener: writingOrderToTheDatabaseWasNotSuccessful: " + writingOrderToTheDatabaseWasNotSuccessful.get());

                 } else {

                    Log.e("dbTAG", task.getException().getMessage());
                 }
                    }//end method onComplete
                });//end addOnCompleteListener
            if (internalCounterAttempsWriteDataInTheFBDatabase >=10) {
                writingOrderToTheDatabaseWasNotSuccessful.set(true);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }//end while loop
        Log.e("LogTag", "EndWhile: writingOrderToTheDatabaseWasSuccessful: " + writingOrderToTheDatabaseWasSuccessful.get());
        Log.e("LogTag", "EndWhile: writingOrderToTheDatabaseWasNotSuccessful: " + writingOrderToTheDatabaseWasNotSuccessful.get());


        //Show a toast about the order
        if (writingOrderToTheDatabaseWasSuccessful.get() ==true) {
            int duration = Toast.LENGTH_LONG;
            Toast toast = Toast.makeText(getContext(), getString(R.string.message_orderSubmittedSuccessfully), duration);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
        }

        if (writingOrderToTheDatabaseWasNotSuccessful.get() ==true) {
            int duration = Toast.LENGTH_LONG;
            Toast toast = Toast.makeText(getContext(), getString(R.string.message_orderSubmittedNotSuccessfully), duration);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
        }



        Navigation.findNavController(...);

    }//end method onClick

}//end class

問(wèn)題在于onComplete方法的異步調(diào)用。更改布爾值的代碼不會(huì)立即調(diào)用,因?yàn)樗窃诋惒秸{(diào)用的onComplete方法中調(diào)用的。這意味著在我的示例中,onComplete方法中的代碼是在10次While循環(huán)迭代之后調(diào)用的,而不是在循環(huán)期間調(diào)用的。現(xiàn)在最大的問(wèn)題是如何在While循環(huán)期間調(diào)用onComplete方法中的任何代碼。

更新:以下是運(yùn)行代碼時(shí)來(lái)自logcat的(相關(guān))輸出:

E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 1
    writingOrderToTheDatabaseWasSuccessful: false
    writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 2
E/LogTag: writingOrderToTheDatabaseWasSuccessful: false
    writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 3
    writingOrderToTheDatabaseWasSuccessful: false
    writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 4
E/LogTag: writingOrderToTheDatabaseWasSuccessful: false
    writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 5
E/LogTag: writingOrderToTheDatabaseWasSuccessful: false
    writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 6
    writingOrderToTheDatabaseWasSuccessful: false
    writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 7
E/LogTag: writingOrderToTheDatabaseWasSuccessful: false
    writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 8
    writingOrderToTheDatabaseWasSuccessful: false
E/LogTag: writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 9
    writingOrderToTheDatabaseWasSuccessful: false
    writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: internalCounterAttempsWriteDataInTheFBDatabase: 10
E/LogTag: writingOrderToTheDatabaseWasSuccessful: false
E/LogTag: writingOrderToTheDatabaseWasNotSuccessful: false
E/LogTag: EndWhile: writingOrderToTheDatabaseWasSuccessful: false
    EndWhile: writingOrderToTheDatabaseWasNotSuccessful: true
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
    Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
    Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
    Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
E/LogTag: Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
    Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
    Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
    Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
E/LogTag: Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
E/LogTag: Listener: writingOrderToTheDatabaseWasNotSuccessful: false
E/dbTAG: Data successfully written.
E/LogTag: Listener: writingOrderToTheDatabaseWasSuccessful: true
    Listener: writingOrderToTheDatabaseWasNotSuccessful: false

結(jié)果是該項(xiàng)在FireBase數(shù)據(jù)庫(kù)中保存了10次。我想要的是嘗試在Firebase數(shù)據(jù)庫(kù)中存儲(chǔ)該項(xiàng)目一次。如果這是成功的,循環(huán)應(yīng)該停止,并且應(yīng)該有一個(gè)祝酒詞告訴它是成功的。如果不成功,則循環(huán)應(yīng)嘗試10次(延遲1秒)。如果嘗試10次后仍無(wú)法將該項(xiàng)目存儲(chǔ)在FireBase數(shù)據(jù)庫(kù)中,則應(yīng)停止循環(huán),并且應(yīng)顯示一條吐司消息,告知無(wú)法存儲(chǔ)該項(xiàng)目。

推薦答案

創(chuàng)建擴(kuò)展Android視圖模型的自定義類

        public class MyViewModel extends AndroidViewModel{

        private MutableLiveData<Boolean> writingSuccessful=new MutableLiveData<>();

            public MyViewModel(@NonNull Application application)
            {
                // you can do any other stuff here if you want
               }


            public void setBooleanWritingSuccessful(Boolean b)
            {
                writingSuccessful.setValue(b);
             }


            public LiveData<Boolean> getBooleanWritingSuccessful()
            {
               return writingSuccessful;
             }



        }

然后在片段中使用此自定義視圖模型類來(lái)觀察值的更改

    public class FR_Fragment extends Fragment implements View.OnClickListener {
       

       private MyViewModel myViewModel;
       private boolean writingSuccessfull= false;



                @Override
                public void onCreate(Bundle savedInstanceState)
                {
                    // your stuffs

                    // initialize viewmodel

                    myViewModel=new ViewModelProvider(this,ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication())).get(MyViewModel.class);




                }





                @Override
                public void onCreateView(LayoutInflater inflater, ViewGroup container,
                                             Bundle savedInstanceState)
                {
                    
                        
                        // set your viewmodel for observing the changes in boolean values.

                        myViewModel.getBooleanWritingSuccessful().observe(getViewLifecycleOwner(),new Observer<Boolean>(){

                            @Override
                            public void onChanged(Boolean b)
                            {

                                // update your writingSuccessful variable here.
                                writingSuccessfull=b;

                            }
                        });



                }



    // In onClick update your viewmodel's mutablelivedata;

                    public void onClick(View view) {
                    ...

                    firebase_DB.child(id).setValue(currentOrder).addOnCompleteListener(new OnCompleteListener<Void>() {
                                     @Override
                                        public void onComplete(@NonNull Task<Void> task) {
                                         if (task.isSuccessful()) {


                                             //writingSuccessfull=true;
                                             //writingNotSuccessfull= false;

                                             //update the viewmodel's mutableLiveData 
                                             myViewModel.setBooleanWritingSuccessful(true);



                                             Log.e("dbTAG",  "Data successfully written.");

                                            } else {


                                             //writingSuccessfull=false;
                                             //writingNotSuccessfull= true;



                                             //update the viewmodel's mutableLiveData 
                                             myViewModel.setBooleanWritingSuccessful(false);


                                             Log.e("dbTAG", task.getException().getMessage());
                                            }
                                        }
                                });


                    }




                }

這是MVVM體系結(jié)構(gòu)的一個(gè)簡(jiǎn)單片段。希望它現(xiàn)在起作用了。謝謝。

這篇關(guān)于如何在Java for Android中修改新創(chuàng)建的監(jiān)聽(tīng)器中的外部布爾值的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,

分享到:
標(biāo)簽:Java 修改 創(chuàng)建 器中 如何在 布爾值 監(jiān)聽(tīng)
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定