বাংলায় Android MVVM আর্কিটেকচারাল প্যাটার্ন (পর্ব ২)

Android MVVM এর পর্ব ১ দেখতে চাইলে এখানে ক্লিক করুন।গত পর্বে আমরা শুধু MVVM এর মূল বিষয়গুলো আয়ত্ব করেছি ।এই পর্বে একটা লাইভ ছোট প্রজেক্ট করে দেখাবো।

প্রজেক্ট বিবরণ –

একটি এপ বানাবো যা গিটহাবে গুগলের যতগুলো প্রজেক্ট আছে তা একটি লিস্টে শো করে দেখাবে ।

এখানে এপটি কিভাবে প্রতিটি লেয়ারে কাজ করবে তা দেখানো হয়েছে।

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

ধাপ ১ – প্রথমেই মেনিফেস্টে গিয়ে ইন্টারনেট পারমিশন অন করে দিতে হবে।

ধাপ ২ – ডিপেন্ডেন্সি এড করতে হবে গ্রেডেলে গিয়ে।

def lifecycle_version = "1.1.1"

// ভিউমডেল এবং লাইভ ডাটার জন্য নিজের এই এনোটেশন যোগ করতে হবে প্রথমে।
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// Retrofit
    implementation "com.squareup.retrofit2:retrofit:$project.retrofit"
    implementation "com.squareup.retrofit2:converter-gson:$project.retrofit"

ধাপ ৩ – মডেল বানাতে হবে ।যা হবে এক একটি গিটহাবের প্রজেক্টের অবজেক্ট।

public class Project {
    public long id;
    public String name;
    public String full_name;
    public String html_url;
    public String description;
    public String url;
    public Date created_at;
    public Date updated_at;
    public Date pushed_at;
    public String git_url;
    public String ssh_url;
    public String clone_url;
    public String svn_url;
    public String homepage;
    public int stargazers_count;
    public int watchers_count;
    public String language;
    public boolean has_issues;
    public boolean has_downloads;
    public boolean has_wiki;
    public boolean has_pages;
    public int forks_count;
    public int open_issues_count;
    public int forks;
    public int open_issues;
    public int watchers;
    public String default_branch;

    public Project() {
    }

    public Project(String name) {
        this.name = name;
    }
}

ধাপ ৪ – ভিউ মডেল ক্লাস বানাতে হবে।

public class ProjectListViewModel extends AndroidViewModel {
    private final LiveData<List<Project>> projectListObservable;

    public ProjectListViewModel(Application application) {
        super(application);
        projectListObservable = ProjectRepository.getInstance().getProjectList("Google");
    }


    public LiveData<List<Project>> getProjectListObservable() {
        return projectListObservable;
    }
}

এখানে আমরা List<project> কে লাইভ ডাটা বানিয়ে দিলাম।মানে হল এখন থেকে যখনই এর ভিতরে কোন পরিবর্তন আসবে তখনই একটি ইভেন্ট ট্রিগার হবে।আমরা আরো খেয়াল করছি এখানে রিপোজিটরির একটি অবজেক্ট তৈরী করা হয়েছে।এরপর সেই অবজেক্ট থেকে সরাসরি আমরা ডাটা পাচ্ছি।ডাটা কিভাবে পাচ্ছি আমরা জানিনা।সেই কাজ সব সব হবে রিপোজিটরি অংশে।আর ভিউতে কি ডাটা শো করবে তাও আমরা দেখবো কিভাবে তা ভিউমডেলই প্রোভাইড করে থাকে।

ধাপ ৫ – ভিউ বানানো।আসলে ভিউ হবে মুল একটি একটিভিটি যেখানে আমরা লিস্টটি দেখাবো।

public class MainActivity extends AppCompatActivity implements ProjectClickCallback {
ProjectListViewModel projectListViewModel;
RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView=findViewById(R.id.projectListRecyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        projectListViewModel=ViewModelProviders.of(this).get(ProjectListViewModel.class);

        projectListViewModel.getProjectListObservable().observe(this, new Observer<List<Project>>() {
            @Override
            public
            void onChanged(@Nullable List<Project> projects) {
                recyclerView.setAdapter(new ProjectAdapter(MainActivity.this,projects));
            }
        });

    }


    @Override
    public
    void onClick(Project project) {
        Log.d("GK",project.name+" is the selected project");
        Toast.makeText(MainActivity.this,"Project name: "+project.name,Toast.LENGTH_LONG).show();
    }
}

এখানে আমরা দেখতে পাচ্ছি যে আমরা লাইভ ডাটার একটি কলব্যাক পাচ্ছি যে কখন লাইফ ডাটা চেঞ্জ হচ্ছে।আসলে তখনই আমরা রিসাইকেল ভিউয়ারে এডাপটার সেট করছি।একটা সিনারিও কল্পনা করুন। এখন যদি কোনভাবে এই লাইভ ডাটাকে আমরা এক সেকেন্ড পর পর পরিবর্তন করতে পারি তাহলে দেখবো যে তা রিসাইকেল ভিউয়ারকেও পরিবর্তন করছে কারন এই লাইভ ডাটার কল ব্যাকে আমরা এডাপটার সেট করেছি।

ধাপ ৫ – রিপোজিটরি ক্লাসটি দেখা যার এখন।

public class ProjectRepository {
    private GitHubService gitHubService;
    private static ProjectRepository projectRepository;

    private ProjectRepository() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(GitHubService.HTTPS_API_GITHUB_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        gitHubService = retrofit.create(GitHubService.class);
    }

    public synchronized static ProjectRepository getInstance() {
        if (projectRepository == null) {
            if (projectRepository == null) {
                projectRepository = new ProjectRepository();
            }
        }
        return projectRepository;
    }

    public LiveData<List<Project>> getProjectList(String userId) {
        final MutableLiveData<List<Project>> data = new MutableLiveData<>();

        gitHubService.getProjectList(userId).enqueue(new Callback<List<Project>>() {
            @Override
            public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
                data.setValue(response.body());
            }

            @Override
            public void onFailure(Call<List<Project>> call, Throwable t) {
                // TODO better error handling in part #2 ...
                data.setValue(null);
            }
        });

        return data;
    }

    

//এটি ব্যবহার করে আমি ইচ্ছা করেই একটু বিলম্ব করেছি ডাটা রিটার্ন করতে যেন আমরা ভাল করে ধরতে পারি আসলে কি হচ্ছে লাইভ ডাটায়।
    private void simulateDelay() {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

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

এই পোস্টে মুলত MVVM এর বিষয়গুলোই আলোচনা করা হল।আমি ধরে নিচ্ছি আপনি বেসিক নেটওয়ার্ক কলিংসহ এর প্রাথমিক জিনিসগুলোর প্রতি ধারনা রাখেন। এখানে ফুল প্রজেক্টের গিটহাব লিংক দেয়া হল।চাইলে দেখে দিবেন এবং কোন সমস্যা হলে কমেন্ট করে জানাবেন।আমিও বিগেনার।MVVM শিখছি।আর শেখার অন্যতম ভাল পদ্ধতি হলো অন্যকে শেখানো।তাই ব্লগে লিখছি।তাই আমারও ভুল হওয়াটা স্বাভাবিক।

ফেসবুক এ শেয়ার করুন

Leave a Reply

Your email address will not be published. Required fields are marked *