Java Android AsyncTask onPostExecute访问GUI元素时给出空指针

Java Android AsyncTask onPostExecute访问GUI元素时给出空指针,java,android,android-asynctask,Java,Android,Android Asynctask,我正在Android中执行一个AsyncTaskweb请求。web请求代码可以工作并返回变量,因为我可以将它们输出到日志中,无需担心,并且可以查看所有需要查看的内容 我一定是误解了AsyncTask,我以为在onPostExecute方法中我们可以访问GUI,但当我尝试运行findViewById时,我总是得到空指针。 TextView textView; public void onCreate(Bundle savedInstanceState) { super.onCreate(

我正在Android中执行一个
AsyncTask
web请求。web请求代码可以工作并返回变量,因为我可以将它们输出到日志中,无需担心,并且可以查看所有需要查看的内容

我一定是误解了
AsyncTask
,我以为在
onPostExecute
方法中我们可以访问GUI,但当我尝试运行
findViewById时,我总是得到空指针。

TextView textView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.outputView);
}

protected void onPostExecute(String result) {
    Log.w("CleverMining", "Posting results..." + result);
    textView.setText(result);
}
此处布局XML-活动\u main.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/updateStats" android:text="@string/update_stats"></Button>

<TextView android:id="@+id/outputView" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/empty"></TextView>

</LinearLayout>

因此,日志可以看到正确的输出ezpz,但是当我查找文本视图时,会得到空指针,这意味着可能超出了范围或其他内容。请帮忙

如何从AsyncTask的onPostExecute方法访问主活动中的文本视图?

更新:LOGCAT输出在

更新2:
创建一个类级文本视图,然后在onCreate()中实例化它,会出现相同的空指针错误

您需要将活动上下文传递给asynctask类。setContentView适用于活动类,而不是实现asynctask的类

如果活动类称为MainActivity,则可以替换setContentView行

与MainActivity.this.setContentView()一起使用


对findViewById函数也要执行同样的操作。

任何初始化都应该在活动的onCreate()方法中完成。所以请移动

setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.outputView);
到您的onCreate方法。而且只打电话

textView.setText(result);

在postExecute()方法中。还要确保textView是类级变量,以便在onCreate()之外访问它。

几个月前,我也遇到了这个问题。我不确定,但我认为这是可行的

protected void onPostExecute(String result) {
Log.w("CleverMining", "Posting results..." + result);
setContentView(R.layout.activity_main);
    runOnUiThread(new Runnable() {
         public void run() {
     TextView textView = (TextView) findViewById(R.id.outputView);
             textView.setText(result);
        }
    });
}

如果您已经将代码移动到onCreate(),那么只需在onPostExecute()方法中使用它即可

  runOnUiThread(new Runnable() {
     public void run() {
         if(!result.equalsIgnoreCase("")) {
         textView.setText(result);

         }
    }
 });

还要检查您的TextViewid是否与布局xml文件中的id相同。

要分析NPE,我们需要日志的完整堆栈跟踪方法setContentView()未为asyncTask()定义。我假设要编译它,您将它作为一个内部类。什么是outter类?但为什么要在onPostExecute()方法中设置布局。将其置于onCreate()方法上。检查活动的布局是否包含该视图必须在onCreate()方法上调用setContentView()。是否确实存在布局R.layout.activity_main和R.id.outputView?您也可以发布布局xml吗?还有,刚刚注意到了发布结果。。。如果您看到结果未被打印。检查结果是否有值,并在调用setText()之前添加空检查结果将打印到日志中。我用我的布局更新了主要问题。谢谢您的布局是否命名为R.layout.activity\u main?清除项目,然后运行。行setContentView(R.layout.activity_main);现在给我空指针,发生了什么…用activity发布AsyncTask类我在onCreate()中查找textView时得到相同的空指针。它确实存在,并且有正确的名称,我可以从其他类写入它。