2012-05-31 2 views
1

나는 항상 도움을 청하지 않는다. 나는 항상 나의 연구를하고 나 자신에 의해 해결책을 찾으려고 노력하지만, 이번에는 정말로 갇혀있다 ... 나는 몇몇 언어에 많은 경험을했지만 그렇지 않다. 자바와 함께 ... 그래서, 내가 뭘 하려는지 동적 레이아웃을 가지고 특정 호스트의 XML 파일에서로드 응용 프로그램입니다. 제 첫 번째 문제는 분명히 메인 스레드에서 XML을 읽을 수 없기 때문에 스레드와 Asynctaks에 대해 배워야했습니다. 그리고 간단한 스레드를 사용하고 일부 전역 변수에 값을 저장하기로 결정했습니다. 생성되었지만 작동하지 않습니다 ... XML 파서에 SAX를 사용하려고했지만 DOM을 선호합니다. 3 일 동안이 작업을하려고하는데 조금 화가 나서 누군가가 나를 도울 수 있기를 바랍니다.누구나 안드로이드 XML 파서를 도와 줄 수 있습니까?

이것은 내가 정의하는 클래스입니다. 내 멍청 아. 그들은 모두 하나 이상의 값을 처리해야한다고 가정합니다. 단 하나의 값을 제외하고는 XML의 URL을 저장하여 스레드에서 사용합니다. 나는 누군가가 여기에 나에게 약간의 도움을 줄 수 있기를 바랍니다

도 예외가 감지되고 있지
//Create the basic layout 
ScrollView sv = new ScrollView(this); 
    LinearLayout ll = new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    sv.addView(ll); 
Info.XML="mylink"; 
Thread thread = new Thread() 
{ 
    @Override 
    public void run() { 
     try { 
      URL url = new URL(Info.XML); 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document doc = db.parse(new InputSource(url.openStream())); 
      doc.getDocumentElement().normalize(); 
      NodeList ActionContainers = doc.getElementsByTagName("ActionContainer"); 
      Node mainContainer = ActionContainers.item(0); 
      Element Container = (Element) mainContainer; 
      NodeList Actions = Container.getElementsByTagName("Action"); 
      for (int i = 0; i < Actions.getLength(); i++) { 
       Node mainAction = Actions.item(i); 
       Element Action = (Element) mainAction; 
       Info.Param1[i]=Action.getAttribute("Param1"); 
       Info.Param2[i]=Action.getAttribute("Param2"); 
       Info.Param3[i]=Action.getAttribute("Param3"); 
       Info.Param4[i]=Action.getAttribute("Param4"); 
       Info.Param5[i]=Action.getAttribute("Param5"); 
       Info.Param6[i]=Action.getAttribute("Param6"); 
      } 
     } catch (Exception e) { 
      Info.XML="Erro"; 
     } 
    } 
}; 
try{ 
    thread.start(); 
} catch(Exception e){ 
    Info.XML="Erro"; 
} 

    EditText et = new EditText(this); 
     et.setText(Info.XML); 
     ll.addView(et); 
     setContentView(sv); 

, 그것은 단순히 XML 정보를 반환하지 않습니다 ... :

public class Info { 
     public static String Param1[]; 
     public static String Param2[]; 
     public static String Param3[]; 
     public static String Param4[]; 
     public static String Param5[]; 
     public static String Param6[]; 
     public static String XML; 
} 

그리고 여기 내 주요 스레드 .

감사

편집 : 여기

은 XML이다 : 나는 모든 XXX 필요

<appname Version="yyy" WrittenOn="yyy"> 
<Config> 
    <Page Id="yyy"> 
     <ActionContainer Id="yyy"> 
      <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action> 
      <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action> 
      <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action> 
      <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action> 
      ... 
     </ActionContainer> 
    </Page> 
</Config> 

, 나는 가능하면 multimensional 배열을 가지고 싶습니다 .

+1

을하는 데 도움이 http://www.ibm.com/developerworks/xml/library/x-android/

희망, 당신은 구문 분석을 시도하고있는 실제 XML을 포함하는 답변을 편집 할 수있는 SAX 부분을 읽어? –

+0

빠른 답변 감사합니다. XML로 내 게시물을 편집했습니다. 도와 주실 수 있기를 바랍니다. –

+0

이미 응답해야하므로 답변 할 사람이 있는지 확실하지 않습니다. 자다 :). 그러나 가능한 한 많은 활동을 게시 할 수 있습니까? 언뜻보기에 약 3 가지 문제가있는 부분을 볼 수 있지만 지금은 어떤 버그가 발생했는지 확신 할 수 없습니다. –

답변

0

I은 ​​아직 행방 불명 일부 코드가 있다고 생각하지만, 당신이 좌초 떠나지 않을의 이익을 위해, 여기 잘못 될 수있는 몇 가지이다 :

  • et.setText(Info.XML); 전에 을 실행할 수 있습니다 당신이 실제로 예외가되지 않을 수도를 스레드가 완료되고 "ErrNo"가 무시됩니다. 이에 내 노트 :
    • 가능한 XML 파일에 잘못된 URL이 (원격 문서 앱에서 INTERNET 권한이 있어야합니다 것을 명심)이, 당신이 게시 된 XML이 유효
    • : <appname>입니다 닫히지 않았거나 루트 요소가 없습니다. 당신이 그들을 초기화 할 경우에도
    • 당신이 NullPointerException 될 것이다, 어디서나 Info.ParamX 배열을 초기화하지 않는 것,
    • , 당신은 ArrayIndexOutOfBoundsException 또는 초래할 수있는 Actions.getLength()의 크기를 차지하지 않는 비슷한; 즉, for 루프 전에 Info.ParamX = new String[Actions.getLength()];을 포함하십시오.
    • 그 외에는 구문 분석 코드가 제대로 작동하는 것 같습니다. 코드를 올바르게 디버그하려면 ADT의 디버그 옵션을 사용하거나 System.out.println()을 사용하여 catch 절에 예외를 출력하고 LogCat에서 검사하십시오.
  • 이 코드는 어디에 위치해 있습니까? 액티비티가 onCreate()에 없다면 배치하십시오. 또한

, 몇 가지 사소한 문제 :

  • 시도는 자바 필드와 변수 camelBack 표기법을 사용하는,이 자바 프로그래머를위한 코드를 읽기 쉽게 만들 것입니다.
  • 스로 어웨이 앱에 Thread을 사용하면 문제가 없지만 일반적으로 피해야합니다. AsyncTask (이 내용은 읽으 셨습니다)으로 바꾸십시오.

추신. ParamX에서 X은 물론 1에서 6까지의 모든 정수입니다.

0

Thread 대신 AsyncTask을 사용해보세요. 여기를 참조하십시오 :

스레딩에 공식 안드로이드 페이지가 꽤 좋은 http://developer.android.com/resources/articles/painless-threading.html

http://developer.android.com/reference/android/os/AsyncTask.html

이 아주 잘 설명이 너무 내 응용 프로그램을 구문 분석 XML에 대해서는 http://labs.makemachine.net/2010/05/android-asynctask-example/

는 XML을 많이 사용합니다 HTTP 요청에서 가져온 것으로 SAX 파서가 매우 유용하고 사용하기 쉽다는 것을 알게되었습니다.

SAX 예제에 대해서는 길이가 시간이었습니다.하지만이 예제가 내 북마크에서 발견되어 잘하면 도움이됩니다. 그냥 완전성에 대한

관련 문제