Android 如何在具有延迟Runnable的片段中避免NullPointerException

Android 如何在具有延迟Runnable的片段中避免NullPointerException,android,kotlin,Android,Kotlin,我有一个应用程序有5个标签,3个是相同的片段,两个是不同的片段。这个问题发生在所有5个片段中,因为代码是相同的 当我快速点击标签,并且我的AutoCompleteTextView中有一些文本时,应用程序崩溃了 在初始化或初始化组件之前,我尝试检查组件(listAdapter和ArrayAdapter)是否不为空 override fun afterTextChanged(s: Editable?) { val db = DataBaseHandler(context)

我有一个应用程序有5个标签,3个是相同的片段,两个是不同的片段。这个问题发生在所有5个片段中,因为代码是相同的

当我快速点击标签,并且我的
AutoCompleteTextView
中有一些文本时,应用程序崩溃了

在初始化或初始化组件之前,我尝试检查组件(
listAdapter
ArrayAdapter
)是否不为空

override fun afterTextChanged(s: Editable?) {
            val db = DataBaseHandler(context)
            var listAdapter: ArrayAdapter<String>

            Handler().postDelayed({
                search = etSearch.text.toString().trim()
                if (search.length >= 3){
                    resultList.clear()
                    products = if (isNumeric(search)) db.readData_SomeProductsId(search)
                        else db.readData_SomeProductsDesc(search)
                    for (product in products!!)
                        resultList.add(product.prod_description)
                    if (resultList.size == 1){
                        product = products!![0]
                        ETClear(etSearch)
                        addProduct()
                    } else{
                        if (resultList.size > 1){
                            listAdapter = ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, resultList)
                            etSearch.setAdapter(listAdapter)
                            etSearch.showDropDown()
                        }

                    }
                }
            }, 600)

            etSearch.setOnItemClickListener{ parent,view,position,id->
                val selectedItem = parent.getItemAtPosition(position).toString()
                product = db.readData_ProductDescription(selectedItem)!!
                ETClear(etSearch)
                addProduct()
            }
        }
override fun afterextchanged(s:可编辑?){
val db=数据库处理程序(上下文)
变量listAdapter:ArrayAdapter
Handler().postDelayed({
search=etSearch.text.toString().trim()
如果(search.length>=3){
resultList.clear()
products=if(isNumeric(search))db.readData\u SomeProductsId(search)
else db.readData_SomeProductsDesc(搜索)
for(产品中的产品!!)
结果列表.添加(产品.产品描述)
if(resultList.size==1){
产品=产品!![0]
ETClear(etSearch)
addProduct()
}否则{
如果(resultList.size>1){
listAdapter=ArrayAdapter(上下文,android.R.layout.simple\u微调器\u下拉列表\u项,结果列表)
etSearch.setAdapter(listAdapter)
etSearch.showDropDown()
}
}
}
}, 600)
setSearch.setOnItemClickListener{parent,view,position,id->
val selectedItem=parent.getItemAtPosition(position).toString()
product=db.readData\u ProductDescription(selectedItem)!!
ETClear(etSearch)
addProduct()
}
}
错误显示如下:

06-05 18:01:49.034 26859-26859/com.example.said.puntodeventa E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.said.puntodeventa, PID: 26859
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
    at android.view.LayoutInflater.from(LayoutInflater.java:234)
    at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:178)
    at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:163)
    at com.example.said.puntodeventa.SaleFragment1$onViewCreated$1$afterTextChanged$1.run(SaleFragment1.kt:109)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7231)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
06-05 18:01:49.034 26859-26859/com.example.said.puntodeventa E/AndroidRuntime:致命异常:main
进程:com.example.said.puntodeventa,PID:26859
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.String)”
位于android.view.LayoutInflater.from(LayoutInflater.java:234)
在android.widget.ArrayAdapter。(ArrayAdapter.java:178)
在android.widget.ArrayAdapter。(ArrayAdapter.java:163)
在com.example.said.puntodeventa.SaleFragment1$onViewCreated$1$afterTextChanged$1.run(SaleFragment1.kt:109)
位于android.os.Handler.handleCallback(Handler.java:739)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:158)
位于android.app.ActivityThread.main(ActivityThread.java:7231)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1230)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

提前感谢

您不能假设您的片段始终具有非空上下文

要解决这一问题,最好能理解在什么地方和适合这个环境

您有一段可运行的代码,故意将执行延迟600毫秒。这将是足够的时间让片段在竞争条件下从其父活动中分离出来,如您提到的
“当我非常快地单击选项卡时”
场景

当它尝试从传入的上下文(为null)创建LayoutFlater时,NullPointerException发生在的内部

根据堆栈跟踪,导致此问题的Runnable中的代码行是:

listAdapter = ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, resultList)

解决此问题的一种方法是将上下文作为可运行块中的第一行进行null检查,如果为null,则提前返回。

您不能假设片段始终具有非null上下文

要解决这一问题,最好能理解在什么地方和适合这个环境

您有一段可运行的代码,故意将执行延迟600毫秒。这将是足够的时间让片段在竞争条件下从其父活动中分离出来,如您提到的
“当我非常快地单击选项卡时”
场景

当它尝试从传入的上下文(为null)创建LayoutFlater时,NullPointerException发生在的内部

根据堆栈跟踪,导致此问题的Runnable中的代码行是:

listAdapter = ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, resultList)

解决此问题的一种方法是将上下文作为可运行块中的第一行进行null检查,如果它为null,则提前返回。

我想问题更多的是
上下文
变量/属性,它有时可能被设置为/返回null。
DataBaseHandler(context)
似乎是一个很可能的候选对象。我想问题更多的是
上下文
变量/属性,它有时可能被设置为/返回null。
DataBaseHandler(context)
似乎是一个很可能的候选对象。我添加了`}else if(context!=null){listAdapter=ArrayAdapter(context,android.R.layout.simple\u spinner\u dropdown\u item,resultList)etSearch.setAdapter(listAdapter)etSearch.showDropDown()}`非常感谢!我添加了`}如果(context!=null){listAdapter=ArrayAdapter,则为`}else(上下文,android.R.layout.simple\u微调器\u下拉列表\u项目,结果列表)etSearch.setAdapter(listAdapter)etSearch.showDropDown()}`非常感谢!