【问题标题】:NullPointerExcepction for TextView.setText() when called inside onPreExecute()在 onPreExecute() 内部调用时 TextView.setText() 的 NullPointerException
【发布时间】: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 RSSReader 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 RSSReader();

              try {
                feed = reader.load(uri);
                Log.d("rss", feed.getTitle());



            } catch (RSSReaderException 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 之前调用了异步任务。所以它得到空指针异常。

标签: java android android-asynctask nullpointerexception


【解决方案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();
      
                  }
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多