为什么我填充后会得到null对象?

时间:2015-04-23 02:31:35

标签: java android nullpointerexception

我从网站上获得了一些inputStream(即http://developer.android.com/training/basics/network-ops/connecting.html) 我有xml解析器,在一个类中我通过解析这个流来制作我自己的对象xml。如果我检查它一切都很好。在我尝试通过getter从另一个类获取此对象后,我得到空指针异常,我不明白为什么。

头等舱

public class Connection {

private final String URLSTRING = "http://blabla.html";
private Xml xml;
private Context context;
private String result;
private boolean connection;

public Xml getXml() {
    return xml;
}

public void setXml(Xml xml) {
    this.xml = xml;
}

public String getResult() {
    return result;
}

public void setResult(String result) {
    this.result = result;
}

public boolean getConnection() {
    return connection;
}

public void setConnection(boolean connection) {
    this.connection = connection;
}

public Connection(Context context) {
    this.context = context;
}
public void connect() {
    ConnectivityManager connMgr = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        new DownloadWebpageTask().execute(URLSTRING);
        connection = true;

    } else {
        connection = false;
    }
}


private class DownloadWebpageTask extends AsyncTask<String, Void,    String> {
@Override
protected String doInBackground(String... urls) {

    // params comes from the execute() call: params[0] is the url.
    try {
        return downloadUrl(urls[0]);
    } catch (IOException e) {
        return "Unable to retrieve web page. URL may be invalid.";
    }
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
    result = "";
}
}
    private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;

    try {
        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        int response = conn.getResponseCode();
        //Log.d(DEBUG_TAG, "The response is: " + response);
        is = conn.getInputStream();


        String contentAsString ="aa";
        XmlParser xmlParser = new XmlParser();
        xml = xmlParser.getParsedXml(is);
        return contentAsString;
    } finally {
        if (is != null) {
            is.close();
        }
    }
}

我试图将DownloadWebpageTask重新编写为xml而没有成功。 第二个主要活动类

public class MainActivity extends ActionBarActivity {

private Button button;
private TextView textView;
private final String URLSTRING = "http://blabla.html";
private Xml xml;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.button);
    textView = (TextView) findViewById(R.id.textView2);
    final Context context = this;

    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Connection con = new Connection(context);
            con.connect();
            if(con.getConnection()){
                xml = con.getXml();
                textView.setText(xml.getDate());
            }else Toast.makeText(getApplicationContext(),
                    "no connection", Toast.LENGTH_LONG).show();

        }

    });
}

尝试设置TextView时出现错误。 谢谢你的建议。 编辑:logcat

FATAL EXCEPTION: main
java.lang.NullPointerException
        at com.example.blackess.connectiontest.MainActivity$1.onClick(MainActivity.java:48)
        at android.view.View.performClick(View.java:2485)
        at android.view.View$PerformClick.run(View.java:9080)
        at android.os.Handler.handleCallback(Handler.java:587)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:130)
        at android.app.ActivityThread.main(ActivityThread.java:3687)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
        at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:1)

这是并发问题。

方法connect()

public void connect() {
  ...
  if (networkInfo != null && networkInfo.isConnected()) {
    new DownloadWebpageTask().execute(URLSTRING);
    connection = true;
  }
}

不等待DownloadWebpageTask AsyncTask完成。它会立即返回。

你能做的就是成为一个倾听者。把它放在Connection

里面
public interface ConnectionListener {
    public void onGotXML(XMl xml);
}

在构造函数中添加它:

ConnectionListener listener;
public Connection(Context context, ConnectionListener listener) {
    this.context = context;
    this.listener = listener;
}
您在postExecute

中致电的

@Override
protected void onPostExecute(String result) {
    listener.onGotXML(this.xml);
}

然后在你的Activity中实现这个监听器:

Connection con;
TextView textView;    

public void onCreate(){
...
   textView = (TextView) findViewById(R.id.textView2);
   con = new Connection(context, new Connection.ConnectionListener(){

   @Override
   public void onGotXML(XMl xml){
      if(xml != null){
         textView.setText(xml.getDate());
      }else{
          Toast.makeText(getApplicationContext(),
                "no connection", Toast.LENGTH_LONG).show();
      }
     }
   });

   button.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
         con.connect();
      }

    });

} 

答案 1 :(得分:0)

我的英语不好,如果您有疑问请发表评论。

根据http://developer.android.com/training/basics/network-ops/connecting.html,您应该在UI线程中调用DownloadWebpageTask,换句话说,View.OnClickListener.onClick()

让您的DownloadWebpageTask课程更新按钮的文字。

我同意@inmyth