我使用XmlPullParserFactory解析在线Xml并在列表视图中显示详细信息。我已经设置了检查互联网的条件,但有时需要时间来获取数据和崩溃。我使用的代码如下。
private void runningABackProcess() {
Handler mHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = new Runnable() {
public void run() {
try{
//Thread.sleep(5000);
new DoSomeTask().execute();
}catch(Exception e){}
// myPd_ring.dismiss();
}
};
mHandler.post(myRunnable);
}
private class DoSomeTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... arg0) {
try {
isInternetPresent = icd.isConnectingToInternet
if(isInternetPresent){
URL url = new URL("njhgjghjkjhkjl");
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser xpp=factory.newPullParser();
xpp.setInput(getInputStream(url), "UTF_8");
int eventType=xpp.getEventType();
if(eventType!=XmlPullParser.END_DOCUMENT)
{
if(eventType==XmlPullParser.START_DOCUMENT)
{
while(eventType!=XmlPullParser.END_DOCUMENT )
{
xpp_name=xpp.getName();
if((xpp_name!=null) )
{
--------------------
-------------------------
}
}
}
}
和
public InputStream getInputStream(URL url) {
try {
InputStream str=null;
isInternetPresent=icd.isConnectingToInternet();
if(isInternetPresent)
{
str=url.openConnection().getInputStream();
if(str!= null)
{
return str;
}else{
new AlertDialogBox(getActivity()).show(getFragmentManager(),"MyDialog");
}
}else{
new AlertDialogBox(getActivity()).show(getFragmentManager(), "MyDialog");
}
return str;
//}
} catch (IOException e) {
return null;
}
}
以下是我得到的错误:
答案 0 :(得分:0)
这似乎是NetworkOnMainThreadException。在这种情况下解决它使用AsyncTask来运行访问网络的代码。
这是因为在主UI线程上访问网络或网络相关任务。这有时会导致应用挂起或崩溃;冻结你的应用程序一段时间。这就是为什么建议您使用AsyncTask解决此问题的原因。
如何使用AysncTask,从这里阅读它非常简单:
http://developer.android.com/reference/android/os/AsyncTask.html
或者您可以在代码中添加此行,以允许主线程上的网络访问:
// Allow network thread to avoid NetworkOnMainThreadException.
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
答案 1 :(得分:0)
我通过更改
解决了这个问题 xpp.setInput(getInputStream(url), "UTF_8"); to
xpp.setInput(url.openConnection().getInputStream(), "UTF_8");