【问题标题】:Having trouble starting listview activity from main UI *ANDROID*从主 UI *ANDROID* 启动 listview 活动时遇到问题
【发布时间】:2012-03-06 06:10:09
【问题描述】:

好的。我有一个带有按钮的主 UI。当用户单击其中一个按钮时,它应该会显示一个由单独的活动创建的列表视图。当我自己运行这个活动时,它是自己的应用程序,它工作得很好,但是当我尝试将它用作更大应用程序的组件时,它会关闭应用程序。这是我尝试调用的活动的代码:

table.java

public class Table extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_table);
    ListView lv= (ListView)findViewById(R.id.listview);

    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();


    String xml = XMLfunctions.getXML();
    Document doc = XMLfunctions.XMLfromString(xml);

    int numResults = XMLfunctions.numResults(doc);

    if((numResults <= 0)){
        Toast.makeText(Table.this, "Nothing to show.", Toast.LENGTH_LONG).show();  
        finish();
    }

    NodeList nodes = doc.getElementsByTagName("team");

    for (int i = 0; i < nodes.getLength(); i++) {                           
        HashMap<String, String> map = new HashMap<String, String>();    

        Element e = (Element)nodes.item(i);
        map.put("rowid", XMLfunctions.getValue(e, "id"));           
        map.put("name", XMLfunctions.getValue(e, "name"));
        map.put("w",  XMLfunctions.getValue(e, "w"));
        map.put("d",  XMLfunctions.getValue(e, "d"));
        map.put("l",  XMLfunctions.getValue(e, "l"));
        map.put("gd",  XMLfunctions.getValue(e, "gd"));
        map.put("pts", XMLfunctions.getValue(e, "pts"));
        mylist.add(map);            
    }       


    //Make a new listadapter
    ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.grid_item,
                    new String[] { "rowid", "name", "w" , "d", "l", "gd", "pts"},
                    new int[] {R.id.item1, R.id.item2, R.id.item3, R.id.item4, R.id.item5, R.id.item6, R.id.item7 });

       lv.setAdapter(adapter);


}

table.java 活动解析该类拉取的 xml 数据:

XMLfunctions.java

public class XMLfunctions {

public final static Document XMLfromString(String xml){

    Document doc = null;

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {

        DocumentBuilder db = dbf.newDocumentBuilder();

        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(xml));
        doc = db.parse(is); 

    } catch (ParserConfigurationException e) {
        System.out.println("XML parse error: " + e.getMessage());
        return null;
    } catch (SAXException e) {
        System.out.println("Wrong XML file structure: " + e.getMessage());
        return null;
    } catch (IOException e) {
        System.out.println("I/O exeption: " + e.getMessage());
        return null;
    }

    return doc;

}

/** Returns element value
  * @param elem element (it is XML tag)
  * @return Element value otherwise empty String
  */
 public final static String getElementValue( Node elem ) {
     Node kid;
     if( elem != null){
         if (elem.hasChildNodes()){
             for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){
                 if( kid.getNodeType() == Node.TEXT_NODE  ){
                     return kid.getNodeValue();
                 }
             }
         }
     }
     return "";
 }

 public static String getXML(){  
        String line = null;

        try {

            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("http://adasoccerclub.org/get_json.php");

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            line = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
        } catch (MalformedURLException e) {
            line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
        } catch (IOException e) {
            line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
        }

        return line;

}

public static int numResults(Document doc){     
    Node results = doc.getDocumentElement();
    int res = -1;

    try{
        res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue());
    }catch(Exception e ){
        res = -1;
    }

    return res;
}

public static String getValue(Element item, String str) {       
    NodeList n = item.getElementsByTagName(str);        
    return XMLfunctions.getElementValue(n.item(0));
}

最后,这是调试中的 LogCat:

03-05 23:43:54.858:E/AndroidRuntime(9190):致命异常:主要

03-05 23:43:54.858:E/AndroidRuntime(9190):java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.club/com.example.club.Table}:android.os。 NetworkOnMainThreadException

03-05 23:43:54.858:E/AndroidRuntime(9190):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)

03-05 23:43:54.858: E/AndroidRuntime(9190): at android.app.ActivityThread.access$600(ActivityThread.java:122)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 android.os.Handler.dispatchMessage(Handler.java:99)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 android.os.Looper.loop(Looper.java:137)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 android.app.ActivityThread.main(ActivityThread.java:4340)

03-05 23:43:54.858: E/AndroidRuntime(9190): at java.lang.reflect.Method.invokeNative(Native Method)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 java.lang.reflect.Method.invoke(Method.java:511)

03-05 23:43:54.858: E/AndroidRuntime(9190): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)

03-05 23:43:54.858: E/AndroidRuntime(9190): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

03-05 23:43:54.858: E/AndroidRuntime(9190): at dalvik.system.NativeStart.main(Native Method)

03-05 23:43:54.858:E/AndroidRuntime(9190):由:android.os.NetworkOnMainThreadException 引起

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)

03-05 23:43:54.858: E/AndroidRuntime(9190): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)

03-05 23:43:54.858: E/AndroidRuntime(9190): at java.net.InetAddress.getAllByName(InetAddress.java:220)

03-05 23:43:54.858: E/AndroidRuntime(9190): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)

03-05 23:43:54.858: E/AndroidRuntime(9190): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)

03-05 23:43:54.858: E/AndroidRuntime(9190): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)

03-05 23:43:54.858: E/AndroidRuntime(9190): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)

03-05 23:43:54.858: E/AndroidRuntime(9190): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)

03-05 23:43:54.858: E/AndroidRuntime(9190): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)

03-05 23:43:54.858: E/AndroidRuntime(9190): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

03-05 23:43:54.858: E/AndroidRuntime(9190): at com.example.club.ClubActivity$XMLfunctions.getXML(ClubActivity.java:205)

03-05 23:43:54.858: E/AndroidRuntime(9190): at com.example.club.MainTable.onCreate(Table.java:30)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 android.app.Activity.performCreate(Activity.java:4465)

03-05 23:43:54.858: E/AndroidRuntime(9190): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)

03-05 23:43:54.858:E/AndroidRuntime(9190):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)

感谢您的所有帮助!

【问题讨论】:

    标签: android xml listview android-activity


    【解决方案1】:

    NetworkOnMainThreadException -

    当应用程序尝试执行 在其主线程上进行网络操作。

    在后台线程而不是主 UI 线程上使用网络操作。

    【讨论】:

    • @Brock:不要在onCreate() 中使用你的活动(this),但是在那个方法之后就可以了。
    【解决方案2】:

    如果你看到你的 logcat,它本身就是 NetworkOnMainThreadException com.example.club.ClubActivity$XMLfunctions.getXML(ClubActivity.java:205)。在 getXML 中,您正在进行网络操作,这本质上是繁重的操作。你只能这样想,如果你在 onCreate 中调用的 getXML Activity 花费了很多时间从服务器加载/获取数据,它会停止 Activity 进入完全可见状态,你可能肯定获得著名的 ANR(应用程序无响应)对话框。所以为了避免这种情况,android doc 建议在后台线程中执行繁重的操作(如网络操作),以便 UI 在指定的时间内呈现。

    因此,您最好更改逻辑并使用AsyncTask 或借助Handler 的新线程获取网络数据。

    【讨论】:

    【解决方案3】:

    您的应用正在尝试在主线程 (UI) 上进行网络调用,这违反了 android 规则。

    请使用 Asynctask 或线程来执行这些长时间运行的操作,例如网络调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多