Android 无法启动活动组件信息{
我有以下错误:Android 无法启动活动组件信息{,android,android-activity,xmlhttprequest,nullpointerexception,components,Android,Android Activity,Xmlhttprequest,Nullpointerexception,Components,我有以下错误: 12-05 20:35:31.005: E/AndroidRuntime(1084): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.helplawyer/com.example.helplawyer.AndroidXMLParsingActivity}: android.os.NetworkOnMainThreadException 在xml清单中,我添加了 这是我
12-05 20:35:31.005: E/AndroidRuntime(1084): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.helplawyer/com.example.helplawyer.AndroidXMLParsingActivity}: android.os.NetworkOnMainThreadException
在xml清单中,我添加了
这是我的主课
package com.example.helplawyer;
public class AndroidXMLParsingActivity extends ListActivity {
// All static variables
static final String URL = "http://www.consultant.ru/rss/hotdocs.xml";
// XML node keys
static final String KEY_ITEM = "item"; // parent node
static final String KEY_TITLE = "title";
static final String KEY_DATE = "pubDate";
static final String KEY_LINK = "link";
static final String KEY_DESC = "description";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainxml);
ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes <item>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
map.put(KEY_LINK, parser.getValue(e, KEY_LINK));
map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
map.put(KEY_DESC, parser.getValue(e, KEY_DESC));
// adding HashList to ArrayList
menuItems.add(map);
}
// Adding menuItems to ListView
ListAdapter adapter = new SimpleAdapter(this, menuItems,
R.layout.list_item,
new String[] { KEY_TITLE, KEY_DESC, KEY_DATE, KEY_LINK }, new int[] {
R.id.name, R.id.description, R.id.cost, R.id.link });
setListAdapter(adapter);
// selecting single ListView item
ListView lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString();
String link = ((TextView) view.findViewById(R.id.link)).getText().toString();
String description = ((TextView) view.findViewById(R.id.description)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
in.putExtra(KEY_TITLE, name);
in.putExtra(KEY_DATE, cost);
in.putExtra(KEY_LINK, link);
in.putExtra(KEY_DESC, description);
startActivity(in);
}
});
}
}
我读到我需要使用新线程(new Runnable(){
但我不知道如何重写我的代码,我的应用程序运行良好。
请帮我解决我的问题!
感谢安卓系统
当应用程序尝试执行异常时引发的异常
主线程上的网络操作。
这仅适用于针对蜂巢SDK或
更高。允许针对早期SDK版本的应用程序执行以下操作
在他们的主事件循环线程上建立网络,但它非常复杂
不鼓励。有关响应性,请参阅文档设计
另请参见StrictMode
查找在后台运行此操作的示例(查找“如何避免ANR”)您正在主
UI线程上运行Network Request
Android>=3.0
不允许在主UI线程上运行networkrequest
。您需要使用
AsyncTask
执行网络操作。您不能从主线程访问网络。
您需要使用AsyncTask。请在查看我的答案
注意AsyncTask
,这里第一个String
是doInBackground
的参数,Void
是onProgressUpdate()
的参数,我们没有实现这个方法,第二个String
是onPostExecute()的参数
现在,从MainActivity
调用new InnerClass().execute(urltoxml);
Android将自动调用doInBackground()
并将urltoxml
作为参数传递`
在doInbackground
中执行所有网络操作,完成后,doInbackground将返回一个结果string
,android将该结果作为参数传递给onPostExecute()
。
无论您希望从onPostExecute如何使用该字符串
public class MainActivity extends Activity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener( new OnClickListener(){
@Override
public void onClick(View v){
new InnerClass().execute(urltoxml);
}
});
}
public class InnerClass extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... arg0) {
String returnVal;
//process your xml here
//store the result in returnVal;
return returnVal;
}
@Override
protected void onPostExecute(String result) {
//do something with the data
}
}
}
public类MainActivity扩展活动实现OnClickListener{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
按钮按钮=(按钮)findViewById(R.id.button1);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
新的InnerClass().execute(urltoxml);
}
});
}
公共类InnerClass扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…arg0){
字符串returnVal;
//在这里处理xml
//将结果存储在returnVal中;
返回值;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//对数据做点什么
}
}
}
不清楚,哪里会出现异常?请添加相关信息。此外,从异常中,我看不到对您发布的代码的任何引用。如果您正在调用getXmlFromUrl方法发布相关代码,那么我们将尝试帮助uAm我说对了,异步任务需要,因为我的“解析器”可以处理“长而重的任务”这就是为什么Android不启动我的应用程序?@user1873342您正在主ui线程上执行网络操作,这是不可能的Android=>3.0谢谢Robin。我刚刚尝试过。我有一个问题:您能告诉我如何从我的主活动调用新的MyInnerClass().execute();(示例代码)。谢谢你的回答!我更新了上面的代码。我有一个解析器xml,它由公共类XMLParser和公共类AndroidXMLParsingActivity组成。据我所知,我需要在受保护字符串doInBackground中插入XMLParser类的公共字符串getXmlFromUrl的一部分。但我不知道下一步是什么,以及它如何与h AndroidXMLParsingActivity classI在上面没有看到任何更新的代码。您在问题中复制了XMLParser类两次。对不起,您是对的。我删除了一份代码。您能解释一下如何插入“doInBackground”和“onPostExecute”吗我的代码来自公共类AndroidXMLParsingActivity和公共类XMLParser,非常感谢!我使用了一个ArrayList(menuItems),当我试图插入“doInBackground”时,我感到很困惑
public class MainActivity extends Activity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener( new OnClickListener(){
@Override
public void onClick(View v){
new InnerClass().execute(urltoxml);
}
});
}
public class InnerClass extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... arg0) {
String returnVal;
//process your xml here
//store the result in returnVal;
return returnVal;
}
@Override
protected void onPostExecute(String result) {
//do something with the data
}
}
}