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

时间:2014-02-22 08:46:23

标签: java android android-asynctask

我在Android中正在进行AsyncTask网络请求。 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 - activity_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,但是当我查找Text-view时,我得到空指针,暗示可能超出范围或其他东西。请帮助?

如何从AsyncTask中的onPostExecute方法访问main活动中的Text-view?

更新:LOGCAT OUTPUT AT http://pastebin.com/ST7r9eAW

更新2: 创建一个类级别Text-view然后在onCreate()中实例化它会给我相同的空指针错误。

4 个答案:

答案 0 :(得分:1)

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

setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.outputView);

到你的onCreate方法。只打电话

textView.setText(result);
postExecute()方法中的

。还要确保textView是一个类级变量,以便在onCreate()之外访问它。

答案 1 :(得分:1)

如果您已将代码移至onCreate(),则只需在 onPostExecute() 方法中使用此方法

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

         }
    }
 });

同时检查您的 TextView ID是否与布局xml文件中的ID相同。

答案 2 :(得分:0)

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

如果您的Activity类名为MainActivity,则可以替换setContentView行

使用MainActivity.this.setContentView()

同样对findViewById函数也这样做。

答案 3 :(得分:0)

几个月前我也有这个问题。我不确定,但我认为这项工作!

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);
        }
    });
}