从日志里说:
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
@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。
@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();
}
发布于 2014-11-26 12:26:22
由于doInBackground()方法运行在与主线程不同的线程上,因此不应该访问doInBackground()方法中的UI元素。您应该在OnProgress()方法或OnPostExcecute()方法中访问UI元素。
发布于 2014-11-26 13:40:56
除非需要同时运行多个任务,否则应该将任务设置为静态内部类。那你就应该把这门课完全分开。
doInBackground执行一个任务,然后将结果返回给onPostExecute。这是ASynctask的通用用途。
不同的是,doInBackground通过后台进程在一个完全独立的线程中运行。你无法保证它何时会运行或结束。它看不到UI线程。然而,onPostExecute在UI线程上运行。
这意味着您的ASyncTask不能保证相同的MainActivity将保持活动状态。由于没有暴露给我们程序员的原因,活动不断地被创建和破坏。例如,任何方向的更改都会破坏您的MainActivity并重新创建它,这意味着您传递的引用现在是空的,而不管它在进程的哪个位置。它可以通过第一个空检查,然后在findViewById上崩溃。您无法保证在onCreate()之外会发生什么。
如果您使它成为一个内部静态类,并在onPostExecute中调用edittext,那么它应该可以正常工作,因为内部类将重新连接到新的活动实例。
发布于 2014-11-26 12:26:48
尝尝这个
@Override
protected void onPreExecute() {
EditText ed=null;
if (mainActivity!=null) {
ed = (EditText) mainActivity.findViewById(R.id.mainSearchActivity_editTextSearch);//******NPE
searchQuery = ed.getText().toString();
} else {
Log.i(TAG, "mainActivity is the Null culprit.");
}
}
https://stackoverflow.com/questions/27148461
复制相似问题