Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng Singleton Dialog cơ bản trong Android

Singleton Dialog không synchronized

Ví dụ này triển khai Singleton Dialog đơn giản không sử dụng synchronized cho phương thức getInstance(). Phù hợp cho các ứng dụng đơn luồng hoặc khi đã đảm bảo truy cập từ Main Thread (UI Thread).

Bước 1: Tạo dự án

Android Studio → File → New Project → hoàn tất thiết lập.

Bước 2: Giao diện (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/start"
        android:text="Bắt đầu Dialog Singleton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/end"
        android:text="Kết thúc Dialog Singleton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

Bước 3: MainActivity.java

package com.example.singletondialogbasic;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    Button btnStart;
    SingleTonExample singletonExample;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnStart = findViewById(R.id.start);
        singletonExample = SingleTonExample.getInstance();

        findViewById(R.id.end).setOnClickListener(v -> singletonExample.dismiss());

        btnStart.setOnClickListener(v -> singletonExample.show(MainActivity.this));
    }
}

Bước 4: SingleTonExample.java

package com.example.singletondialogbasic;

import android.app.Dialog;
import android.content.Context;
import android.view.Window;

public class SingleTonExample {
    private Dialog dialog;
    private static final SingleTonExample ourInstance = new SingleTonExample();

    public static SingleTonExample getInstance() {
        return ourInstance;
    }

    private SingleTonExample() { }

    public void show(Context context) {
        if (dialog != null && dialog.isShowing()) return;
        
        dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.layout_progress_dialog);
        dialog.setCancelable(true);
        dialog.show();
    }

    public void dismiss() {
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }
    }
}

Bước 5: Layout Dialog (layout_progress_dialog.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="https://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <ProgressBar
        android:id="@+id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

Sự khác biệt với phiên bản synchronized

Đặc điểmCó synchronizedKhông synchronized
Thread-safetyAn toàn cho đa luồngChỉ an toàn trên Main Thread
Hiệu năngChậm hơn một chút do lockNhanh hơn
Phù hợpBackground thread, ServiceChỉ UI Thread

Khi nào nên dùng phiên bản nào?

  • Dùng synchronized nếu Singleton có thể được truy cập từ background thread, IntentService, hoặc Worker.
  • Dùng không synchronized nếu chắc chắn chỉ gọi từ Main Thread (Activity/Fragment) để tối ưu hiệu năng.