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