java - ফায়ারবেস শ্রোত্রে সিঙ্গেলটন সম্পত্তি মান সেট করা




android firebase (2)

টিএল; ডিআর: ফায়ারবেস অ্যাসিনক্রোনটিটি আলিঙ্গন করুন

যেমন আমি অন্য post উল্লেখ করেছি, আপনি প্রতিশ্রুতি ব্যবহার করে ফায়ারবেসের অ্যাসিনক্রোনাস প্রকৃতির সাথে মোকাবিলা করতে পারেন। এটি এমন হবে:

public Task<List<Data>> synchronizeBookmarks(List<Bookmark> bookmarks) {
     return Tasks.<Void>forResult(null)
        .then(new GetBook())
        .then(new AppendBookmark(bookmarks))
        .then(new LoadData())
}

public void synchronizeBookmarkWithListener() {
     synchronizeBookmarks()
         .addOnSuccessListener(this)
         .addOnFailureListener(this);
}

com.google.android.gms.tasks

অ্যান্ড্রয়েডের জন্য গুগল এপিআই একটি টাস্ক ফ্রেমওয়ার্ক সরবরাহ করে (যেমন Parse সাথে করেছিলেন), যা জাভাস্ক্রিপ্ট প্রতিশ্রুতি ধারণার অনুরূপ।

প্রথমে আপনি ফায়ারবেস থেকে বুকমার্ক ডাউনলোড করার জন্য একটি Task তৈরি করুন:

class GetBook implements Continuation<Void, Task<Bookmark>> {

    @Override
    public Task<Bookmark> then(Task<Void> task) {
        TaskCompletionSource<Bookmark> tcs = new TaskCompletionSource();

        Firebase db = new Firebase("url");
        Firebase bookmarksRef = db.child("//access correct child");

        bookmarksRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                tcs.setResult(dataSnapshot.getValue(Bookmark.class));
            }
        });

        tcs.getTask();
    }

}

এখন আপনি যে ধারণাটি পেয়েছেন, setBookmarks যে setBookmarks এবং loadSampleData । আপনি এগুলি Continuation (পূর্ববর্তীগুলির মতোই) Continuation কাজ হিসাবেও তৈরি করতে পারেন:

class AppendBookmark(List<Bookmark> bookmarks) implements
    Continuation<List<Bookmark>, Task<Bookmark> {

    final List<Bookmark> bookmarks;

    LoadBookmarks(List<Bookmark> bookmarks) {
        this.bookmark = bookmark;
    }

    @Override
    Task<List<Bookmark>> then(Task<Bookmark> task) {
        TaskCompletionSource<List<Bookmark>> tcs = new TaskCompletionSource();
        bookmarks.add(task.getResult());         
        tcs.setResult(this.bookmarks);
        return tcs.getTask();
    }
}

class LoadSampleData implements Continuation<List<Bookmark>, List<Data>> {
    @Override
    public Task<List<Data>> then(Task<List<Bookmark>> task) {
        // ...
    }
}

আমি বর্তমানে পুরো অ্যাপ্লিকেশনটির জীবনকাল চলাকালীন অ্যাক্সেস পেতে ব্যবহার করার পরিকল্পনা করছি এমন একক মডেল সহ ফায়ারবেস পরীক্ষা করছি। আমি এখন এমন কিছু নিয়ে আটকেছি যা সত্যিই তুচ্ছ মনে হচ্ছে তবে আমি আমার জীবনের জন্য এটি বুঝতে পারি না। আমি যে মডেলটি ব্যবহার করি তার একটি নমুনা রয়েছে: ফায়ারবেসে বুকমার্ক।

public class BookSingleton {



private static BookSingleton model;

private ArrayList<BookMark> bookmarks = new ArrayList<BookMark>();


public static BookSingleton getModel()
{
    if (model == null)
    {
        throw new IllegalStateException("The model has not been initialised yet.");
    }

    return model;
}


public ArrayList<Bookmark> theBookmarkList()
{
    return this.bookmarks;
}


public void setBookmarks(ArrayList<Bookmark> bookmarks){
    this.bookmarks = bookmarks;
}


public void loadModelWithDataFromFirebase(){
    Firebase db = new Firebase(//url);
    Firebase bookmarksRef = fb.child(//access correct child);


    final ArrayList<Bookmark> loadedBookmarks = new ArrayList<Bookmark>();
    bookmarksRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                    //getting all properties from firebase...
                    Bookmark bookmark = new Bookmark(//properties here);
                    loadedBookmarks.add(bookmark);



                }
            }
            //bookmarks still exist here at this point
            setBookmarks(loadedBookmarks);

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
    //by now loadedBookmarks is empty
    //this is probably the issue?
    //even without this line bookmarks is still not set in mainactivity
    setBookmarks(loadedBookmarks);
}

এখন আমি যখন সিঙ্গেলটন সেটটির উদাহরণ দিয়ে মূল অ্যাকটিভিটি শুরু করি তখন আমি একটি নাল ত্রুটি পেয়েছি কারণ স্পষ্টতই ফায়ারবেস থেকে মডেল ডেটা লোড করার জন্য যে ফাংশনটি আমি লিখেছিলাম তা কিছুই সেট করে না।

এর মতো কিছু: MainActivity

public class MainActivity extends AppCompatActivity {

private BookSingleton theModel;



@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    // Load the model
    theModel = BookSingleton.getModel(this);
      //manually setting this works 
      //        ArrayList<Book> bookSamples = new ArrayList<Book>;
      //        bookSamples.add(aBookSample);

    theModel.loadModelWithSampleData(bookSamples);
    //should have set the singleton model property Bookmarks to the results from firebase

    theModel.loadModelWithDataFromFirebase();
    //returns 0
    Log.d(TAG, "" + theModel.theBookmarkList().size());


    setContentView(R.layout.activity_main);

    //......rest of code

আমি এই কাজটি কীভাবে করব?


ক্লাসটি লোড হওয়ার পরে আপনাকে আপনার সিঙ্গলটনটি শুরু করতে হবে। এটি আপনার কোডে রাখুন:

private static BookSingleton  model = new BookSingleton();

private BookSingleton() {
}

public static BookSingleton getModel() {     return model == null ? new BookSingleton() : model;
}




firebase-realtime-database