在 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()?

Android onPreExecute()、progressDialog 和 json.toString() 错误

AsyncTask

javascript中的this对象