为什么我在填充后得到空对象?

为什么我在填充后得到空对象?

问题描述:

我从网站获取一些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太没有成功。 第二主Activity类,当我尝试建立的TextView

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(); 

     } 

    }); 
} 

错误appeares。 感谢您的建议。 编辑: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) 
+0

发布logcat?提供实际错误的 – Baby

+0

将帮助人们协助 – nomistic

+0

“MainActivity”的第48行是什么? – Emmanuel

这是一个并发问题。

的方法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); 
} 

致电然后在你的活动实现这个监听器:

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(); 
     } 

    }); 

} 
+0

我该怎么做,让这项任务完成他的负载? – previ

+0

只有吐司在错误的地方,但我可以解决这个问题。 完美!谢谢! – previ

我的英文不好,所以如果你有问题请评论。

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

并让你的DownloadWebpageTask类更新按钮的文本。

我同意@inmyth