gpt4 book ai didi

android - 应用程序在模拟器中运行良好但显示 networkonmainthread 异常

转载 作者:行者123 更新时间:2023-11-29 18:08:35 26 4
gpt4 key购买 nike

我创建了一个应用程序,它使用 xml pull 解析器从 url 检索数据。它在模拟器上工作正常,但是当我在选项卡中测试它时,它显示 networkonmainthread 异常。我的代码是:

package com.example.androidsample4;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class UNIXclass extends Activity
{
String unixcommands[];

AutoCompleteTextView actv1;

protected URL params;
static final String URL="http://cympac.com/apps/xmlfile.xml";
static final String KEY_COMMAND = "command"; // parent node
static final String KEY_WORD = "word";
static final String KEY_EXPLANATION = "explanation";


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv1=(TextView)findViewById(R.id.textView1);
AutoCompleteTextView actv=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
Button b1=(Button)findViewById(R.id.button1);
unixcommands=getResources().getStringArray(R.array.Commands);
ArrayAdapter<String> adapter =new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1,unixcommands);
actv1 = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
actv1.setThreshold(1);
actv1.setAdapter(adapter);
b1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v)
{
Mytask task=new Mytask();
task.doInBackground(params);


}
});
}
private class Mytask extends AsyncTask<java.net.URL, Void, Void>
{

@Override
protected Void doInBackground(java.net.URL... params)
{
TextView myXmlContent = (TextView)findViewById(R.id.textView2);
String stringXmlContent = null;
try {
stringXmlContent = getEventsFromAnXML(); // 54 line
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
Toast.makeText(getBaseContext(), "error:"+e.getMessage(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(getBaseContext(), "error:"+e.getMessage(), Toast.LENGTH_SHORT).show();
}
myXmlContent.setText(stringXmlContent);
return null;

}

}
public String getEventsFromAnXML() throws XmlPullParserException,IOException
{
StringBuffer stringBuffer=new StringBuffer();

java.net.URL url=new java.net.URL("http://cympac.com/apps/xmlfile.xml");
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp=factory.newPullParser();
//xpp.setInput(getInputStream(url),"UTF-8"); //84 line
xpp.setInput(url.openConnection().getInputStream(), "UTF-8");
int eventType = xpp.getEventType();
String word = null;

String tag;
while ((eventType = xpp.next()) != XmlPullParser.END_DOCUMENT)
{
if(XmlPullParser.START_TAG==eventType)
{
tag=xpp.getName();
//stringBuffer.append("\n"+tag);
if (tag.equals("word"))
{
eventType = xpp.next();
word = xpp.getText();
}
else if (tag.equals("explanation"))
{
eventType = xpp.next();
//if ("cancel".equals(word))
if(actv1.getText().toString().equals(word))

{
stringBuffer.append("\n" + xpp.getText());
}
}

}

}
return stringBuffer.toString();



}



}

我读到当我们必须使用网络时,我们应该使用 Asynctask。所以我使用了它,但它仍然显示相同的错误。请帮我解决这个问题。logcat o/p

08-21 16:36:41.087 E/AndroidRuntime( 4076): FATAL EXCEPTION: main
08-21 16:36:41.087 E/AndroidRuntime( 4076): android.os.NetworkOnMainThreadException
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.net.InetAddress.getAllByName(InetAddress.java:249)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:69)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1038)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:523)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.example.androidsample4.SANclass.getEventsFromAnXML(SANclass.java:115)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.example.androidsample4.SANclass$Mytask.doInBackground(SANclass.java:92)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.example.androidsample4.SANclass$1.onClick(SANclass.java:58)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.view.View.performClick(View.java:3131)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.view.View$PerformClick.run(View.java:12035)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.os.Handler.handleCallback(Handler.java:587)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.os.Handler.dispatchMessage(Handler.java:92)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.os.Looper.loop(Looper.java:132)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.app.ActivityThread.main(ActivityThread.java:4123)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.lang.reflect.Method.invokeNative(Native Method)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.lang.reflect.Method.invoke(Method.java:491)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at dalvik.system.NativeStart.main(Native Method)
08-21 16:36:41.092 V/AudioPolicyManager( 2713): releaseOutput() 1
08-21 16:36:41.092 W/ActivityManager( 2891): Force finishing activity com.example.androidsample4/.SANclass

如果我包含“new Mytask.execute()”方法,我将强制关闭。这可能是什么原因?请指导我...

最佳答案

不要在后台线程中更新 UI。它应该在 onPostExecute()

中完成
Toast.makeText(getBaseContext(), "error:"+e.getMessage(), Toast.LENGTH_SHORT).show();
myXmlContent.setText(stringXmlContent);

在 onPostExecute() 中执行此步骤

Read my previous post

关于android - 应用程序在模拟器中运行良好但显示 networkonmainthread 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12053742/

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