在 onPreExecute() 内部调用时 TextView.setText() 的 NullPointerException
Posted
技术标签:
【中文标题】在 onPreExecute() 内部调用时 TextView.setText() 的 NullPointerException【英文标题】:NullPointerExcepction for TextView.setText() when called inside onPreExecute() 【发布时间】:2014-05-23 15:54:40 【问题描述】:在d.android.com for onPreExecute() 中声明它在doInBackground(Params...)
之前在UI 线程上运行,因此它应该可以轻松访问TextView
并从Activity
执行setText()
方法,它来自executed()
。
但在下面的代码中,loading
TextView 是在扩展 Activity 的类 SplashScreen
中私有声明的。在onCreate()
内部,它与 UI 的 TextView 小部件链接。但是当AsyncTask
扩展类Atom
函数onPreExecute()
被执行时,它会为在其中执行的语句loading.setText("Loading...");
抛出一个NullPointerExcepction
。
这里是代码
public class SplashScreen extends Activity implements AnimationListener
...
TextView loading=null;
...
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_screen);
try
a = (Atom) new Atom().execute(null,null,null);
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
finish();
...
loading = (TextView) findViewById(R.id.textView2);
....
public class Atom extends AsyncTask<RSSFeed, Void, RSSFeed>
private Rs-s-reader reader;
private RSSFeed feed = null;
private String uri = "http://website.com/feed/";
@Override
protected void onPreExecute()
super.onPreExecute();
//------------problem----area-------------------
loading.setText("Loading...");
//------------problem----area-------------------
@Override
protected RSSFeed doInBackground(RSSFeed... arg0)
reader = new Rs-s-reader();
try
feed = reader.load(uri);
Log.d("rss", feed.getTitle());
catch (Rs-s-readerException e)
// TODO Auto-generated catch block
e.printStackTrace();
return feed;
@Override
protected void onPostExecute(RSSFeed result)
// TODO Auto-generated method stub
super.onPostExecute(result);
prg.cancel();
t(result.getTitle().toString());
堆栈:
03-09 10:50:12.793: W/System.err(14214): java.lang.NullPointerException
03-09 10:50:12.813: W/System.err(14214): at in.edu.ss.er.splash.SplashScreen$Atom.onPreExecute(SplashScreen.java:158)
03-09 10:50:12.827: W/System.err(14214): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
03-09 10:50:12.833: W/System.err(14214): at android.os.AsyncTask.execute(AsyncTask.java:534)
03-09 10:50:12.833: W/System.err(14214): at in.edu.ss.er.splash.SplashScreen.onCreate(SplashScreen.java:45)
【问题讨论】:
你确定你的xml中有一个ID为R.id.textView2
的TextView吗?
你在哪里调用这个 AyncTask ?
请同时添加您的 xml 代码。
在主 UI 线程 SplashScreen 中(编辑问题!)
我认为你在声明 textview 之前调用了异步任务。所以它得到空指针异常。
【参考方案1】:
在执行asyntask
之前尝试初始化TextView
。喜欢以下。
try
loading = (TextView) findViewById(R.id.textView2);
a = (Atom) new Atom().execute(null,null,null);
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
finish();
我不知道这是否正确,这是我的猜测,所以,请告诉我发生了什么。
谢谢
【讨论】:
【参考方案2】:在调用 AsyncTask 之前初始化你的文本视图。做这样的事情
loading = (TextView) findViewById(R.id.textView2);
try
a = (Atom) new Atom().execute(null,null,null);
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
finish();
【讨论】:
【参考方案3】:你必须在调用 asynctask 之前初始化你的 textview。将您的代码更改为以下-
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_screen);
loading = (TextView) findViewById(R.id.textView2);
try
a = (Atom) new Atom().execute(null,null,null);
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
finish();
【讨论】:
以上是关于在 onPreExecute() 内部调用时 TextView.setText() 的 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
异步任务;调用方法 onPreExecute() 后未调用 doInbackground()
Android:如何将参数传递给AsyncTask的onPreExecute()?
Android:如何将参数传递给 AsyncTask 的 onPreExecute()?