2012-03-06 15 views
0

いいえ。私はボタンが付いたメインUIを持っています。ユーザーがボタンの1つをクリックすると、別のアクティビティーによって作成されたリストビューが表示されます。このアクティビティを単独で実行すると、それ自体のアプリとして機能しますが、大きなアプリのコンポーネントとして使用しようとすると、アプリが停止します。ここで私は呼んしようとしている活動のためのコードです。メインUIからのリストビューアクティビティの起動に問題がある* ANDROID *

XMLfunctions.java

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データを解析し、

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):

03-05 23(ActivityThread.java:122)android.app.ActivityThread.access $ 600で: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.Acti vityThread.main(ActivityThread.java:4340)

03-05 23:43:54.858:E/AndroidRuntime(9190):java.lang.reflect.Method.invokeNative(ネイティブメソッド)で

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) :com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)

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

03-05 23:43:54.858:E/AndroidRuntime(9190):43:54.858:E/AndroidRuntime(9190)dalvik.system.NativeStart.main(ネイティブメソッド)

03-05 23で原因: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)で

(9190):java.net.InetAddress.getAllByName(InetAddress.java:220)

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

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

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

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

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

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

03-05 23:43:54.858:E/AndroidRuntime(9190):org.apache.http.impl.client.AbstractHttpClientました。実行(AbstractHttpClient.java:465)

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

03-05 23:43:54.858:E/AndroidRu ntime(9190):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)で

ありがとう!

答えて

0

logcatが表示されている場合は、NetworkOnMainThreadExceptionと表示されています(com.example.club.ClubActivity$XMLfunctions.getXML(ClubActivity.java:205))。 getXMLでは、本質的には重い操作であるネットワーク操作を行っています。アクティビティのonCreateを呼び出しているgetXMLがサーバからデータをロード/フェッチするのに時間がかかる場合は、アクティビティを完全に可視状態に戻し、有名なANRを得ることができるように考えることができますアプリケーションが応答しない)ダイアログが表示されます。したがって、これを避けるために、アンドロイドの文書は、バックグラウンドスレッドで重い操作(ネットワーク操作など)を行い、UIが指定された時間内にレンダリングするように提案しています。

AsyncTaskまたはHandlerの助けを借りて新しいスレッドを使用して、ロジックを変更してネットワークデータを取得する方がよいでしょう。

+0

私はそれをどうやって行うのか全く分かりません。私のアプリでその作業をする方法を理解するのに役立つ良いチュートリアルですか?ありがとう! –

+0

これに関する一連の記事があります。 1. http://www.vogella.de/articles/AndroidPerformance/article.html、2. http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html、3. http: //androidcookbook.com/Recipe.seam?recipeId=2260&title=Using%20AsyncTask%20to%20do%20background%20processing n more more。乾杯..!!! – AndroDev

1

NetworkOnMainThreadException -

アプリケーションがメインスレッドに ネットワーキング操作を実行しようとしたときにスローされる例外。

メインUIスレッドではなくバックグラウンドスレッドでネットワーク操作を使用します。

+0

@Brock:あなたのアクティビティ( 'this')を' onCreate() 'の中で使ってはいけませんが、そのメソッドの後はOKです。 –

0

あなたのアプリケーションは、アンドロイド規則に違反するメインスレッド(UI)上でネットワークコールを試みています。

ネットワークコールなどの長時間実行される操作には、Asynctaskまたはスレッドを使用してください。

関連する問題