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ểm | Có synchronized | Không synchronized |
|---|---|---|
| Thread-safety | An toàn cho đa luồng | Chỉ an toàn trên Main Thread |
| Hiệu năng | Chậm hơn một chút do lock | Nhanh hơn |
| Phù hợp | Background thread, Service | Chỉ 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.