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
    }

}

}