首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓: NullPointerException,这里什么东西是空的?

安卓: NullPointerException,这里什么东西是空的?
EN

Stack Overflow用户
提问于 2014-11-26 11:51:48
回答 4查看 173关注 0票数 2

从日志里说:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@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。

代码语言:javascript
运行
复制
@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();
    }
EN

回答 4

Stack Overflow用户

发布于 2014-11-26 12:26:22

由于doInBackground()方法运行在与主线程不同的线程上,因此不应该访问doInBackground()方法中的UI元素。您应该在OnProgress()方法或OnPostExcecute()方法中访问UI元素。

票数 1
EN

Stack Overflow用户

发布于 2014-11-26 13:40:56

除非需要同时运行多个任务,否则应该将任务设置为静态内部类。那你就应该把这门课完全分开。

doInBackground执行一个任务,然后将结果返回给onPostExecute。这是ASynctask的通用用途。

不同的是,doInBackground通过后台进程在一个完全独立的线程中运行。你无法保证它何时会运行或结束。它看不到UI线程。然而,onPostExecute在UI线程上运行。

这意味着您的ASyncTask不能保证相同的MainActivity将保持活动状态。由于没有暴露给我们程序员的原因,活动不断地被创建和破坏。例如,任何方向的更改都会破坏您的MainActivity并重新创建它,这意味着您传递的引用现在是空的,而不管它在进程的哪个位置。它可以通过第一个空检查,然后在findViewById上崩溃。您无法保证在onCreate()之外会发生什么。

如果您使它成为一个内部静态类,并在onPostExecute中调用edittext,那么它应该可以正常工作,因为内部类将重新连接到新的活动实例。

票数 1
EN

Stack Overflow用户

发布于 2014-11-26 12:26:48

尝尝这个

代码语言:javascript
运行
复制
    @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.");
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27148461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档