android.util.Singleton 源码了解

本文探讨了Android中`android.util.Singleton`类的源码,揭示了其如何实现延迟初始化的单例模式,帮助理解其在Android开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Singleton

单例的助手类延迟初始化。

/**
 * Singleton helper class for lazily initialization.
 *
 * Modeled after frameworks/base/include/utils/Singleton.h
 *
 * @hide
 */
public abstract class Singleton<T> {
    private T mInstance;

    protected abstract T create();

    public final T get() {
        synchronized (this) {
            if (mInstance == null) {
                mInstance = create();
            }
            return mInstance;
        }
    }

调用方式:ActivityManagerNative.getDefault()
调用地点:ActivityManagerNative类
调用作用:是为了获取ActivityManagerProxy

static public IActivityManager getDefault() {
	return gDefault.get();
}	
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
	protected IActivityManager create() {
        IBinder b = ServiceManager.getService("activity");
        if (false) {
             Log.v("ActivityManager", "default service binder = " + b);
        }
        IActivityManager am = asInterface(b);
        if (false) {
             Log.v("ActivityManager", "default service = " + am);
        }
        return am;
    }
};



D Shutting down VM 2025-06-13 01:48:30.658 24649-24649 AndroidRuntime com.example.kucun2 E FATAL EXCEPTION: main Process: com.example.kucun2, PID: 24649 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:454) at android.widget.ArrayAdapter.getView(ArrayAdapter.java:416) at com.example.kucun2.function.Adapter$SafeSpinnerAdapter.getView(Adapter.java:45) at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:206) at android.widget.Spinner.onMeasure(Spinner.java:622) at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:444) at android.view.View.measure(View.java:29007) at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1226) at android.widget.LinearLayout.onMeasure(LinearLayout.java:728) at android.view.View.measure(View.java:29007) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7132) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1613) at android.widget.LinearLayout.measureVertical(LinearLayout.java:883) at android.widget.LinearLayout.onMeasure(LinearLayout.java:726) at android.view.View.measure(View.java:29007) at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1641) at android.widget.FrameLayout.onMeasure(FrameLayout.java:205) at android.widget.ScrollView.onMeasure(ScrollView.java:559) at android.view.View.measure(View.java:29007)package com.example.kucun2.function; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.example.kucun2.entity.Bancai; import com.example.kucun2.entity.Caizhi; import com.example.kucun2.entity.Chanpin; import com.example.kucun2.entity.Dingdan; import com.example.kucun2.entity.Mupi; import com.example.kucun2.entity.Zujian; import java.util.List; public class Adapter { // 安全适配器基类,处理公共逻辑 private static abstract class SafeSpinnerAdapter<T> extends ArrayAdapter<T> { public SafeSpinnerAdapter(Context context, int resource, List<T> objects) { super(context, resource, objects); } @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View view = super.getDropDownView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); T item = getItem(position); // 处理空对象 String text = (item != null) ? formatDropdownText(item) : "空项"; textView.setText(text); return view; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); T item = getItem(position); // 处理空对象 String text = (item != null) ? formatDisplayText(item) : "请选择"; textView.setText(text); return view; } // 在具体适配器中确保返回非空字符串 protected abstract String formatDisplayText(T item); protected abstract String formatDropdownText(T item); } // 1. 材质适配器 public static ArrayAdapter<Caizhi> setupCaizhiSpinner(Spinner spinner, List<Caizhi> data, Context context) { ArrayAdapter<Caizhi> adapter = new SafeSpinnerAdapter<Caizhi>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Caizhi item) { return item != null ? item.getName() : "请选择材质"; } @Override protected String formatDropdownText(Caizhi item) { return item != null ? item.getName() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); return adapter; } // 2. 木皮适配器 public static void setupMupiSpinner(Spinner spinner, List<Mupi> data, Context context) { ArrayAdapter<Mupi> adapter = new SafeSpinnerAdapter<Mupi>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Mupi item) { return item != null ? item.formatMupiDisplay() : "请选择木皮"; } @Override protected String formatDropdownText(Mupi item) { return item != null ? item.formatMupiDisplay() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } // 3. 板材适配器 public static void setupBancaiSpinners(Spinner spinner, List<Bancai> data, Context context) { ArrayAdapter<Bancai> adapter = new SafeSpinnerAdapter<Bancai>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Bancai item) { return item != null ? item.TableText() : "请选择板材"; } @Override protected String formatDropdownText(Bancai item) { return item != null ? item.TableText() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } // 4. 订单适配器 public static void setupDingdanSpinner(Spinner spinner, List<Dingdan> data, Context context) { ArrayAdapter<Dingdan> adapter = new SafeSpinnerAdapter<Dingdan>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Dingdan item) { return item != null ? item.getNumber() : "请选择"; } @Override protected String formatDropdownText(Dingdan item) { return item != null ? item.getNumber() : "请选择"; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } // 5. 产品适配器 public static void setupChanpinSpinner(Spinner spinner, List<Chanpin> data, Context context) { ArrayAdapter<Chanpin> adapter = new SafeSpinnerAdapter<Chanpin>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Chanpin item) { return item != null ? item.getBianhao() : "请选择"; } @Override protected String formatDropdownText(Chanpin item) { return item != null ? item.getBianhao() : "请选择"; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } // 6. 组件适配器 public static void setupZujianSpinner(Spinner spinner, List<Zujian> data, Context context) { ArrayAdapter<Zujian> adapter = new SafeSpinnerAdapter<Zujian>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Zujian item) { return item != null ? item.getName() : "请选择"; } @Override protected String formatDropdownText(Zujian item) { return item != null ? item.getName() : "请选择"; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } }
最新发布
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值