内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持
腾讯云小微IT领域专用引擎提供翻译支持
从日志里说:
11-26 06:43:40.643: E/AndroidRuntime(1163): FATAL EXCEPTION: AsyncTask #1 11-26 06:43:40.643: E/AndroidRuntime(1163): java.lang.RuntimeException: An error occured while executing doInBackground() 11-26 06:43:40.643: E/AndroidRuntime(1163): Caused by: java.lang.NullPointerException 11-26 06:43:40.643: E/AndroidRuntime(1163): at com.example.mymobiletest.SearchTask.doInBackground(SearchTask.java:134)
第134号线是 ed = (EditText) mainActivity.findViewById(R.id.mainSearchActivity_editTextSearch); 。现在,这一行的执行表明 mainActivity (它是传递给这个 AsyncTask 的构造函数的主活动的一个实例)不是 null 。那么,在这一行中还有什么可能是 null ,这导致了 NullPointerException
ed = (EditText) mainActivity.findViewById(R.id.mainSearchActivity_editTextSearch);
mainActivity
AsyncTask
null
NullPointerException
@Override protected String doInBackground(Void... voidParameters) { EditText ed=null; if (mainActivity!=null) { ed = (EditText) mainActivity.findViewById(R.id.mainSearchActivity_editTextSearch); } else { return "mainActivity is the Null culprit."; }
编辑:- --我确实认为,由于我没有在 doInBackground() 中更改UI (而是只从UI中读取),所以这不应该是一个问题。但是我还是在 onPreExecute() 中尝试了这一点,因为 onPreExecute 是在UI线程中执行的,但是我仍然在相同的语句上得到了NPE。
doInBackground()
onPreExecute()
onPreExecute
@Override protected void onPreExecute() { EditText ed=null; if (mainActivity!=null) { ed = (EditText) mainActivity.findViewById(R.id.mainSearchActivity_editTextSearch);//******NPE } else { Log.i(TAG, "mainActivity is the Null culprit."); searchQuery = ed.getText().toString(); }
由于doInBackground()方法运行在与主线程不同的线程上,因此不应该访问doInBackground()方法中的UI元素。您应该在OnProgress()方法或OnPostExcecute()方法中访问UI元素。
尝尝这个
@Override protected void onPreExecute() { EditText ed=null; if (mainActivity!=null) { ed = (EditText) mainActivity.findViewById(R.id.mainSearchActivity_editTextSearch);//******NPE