gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:13:16 25 4
gpt4 key购买 nike

我正在从网站获取一些输入流(即 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 类

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)

最佳答案

这是并发的问题。

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

});

}

关于java - 为什么我填充后得到空对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com