我在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()中实例化它会给我相同的空指针错误。
答案 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);
}
});
}