2013-01-05 5 views
0

나는 안드로이드 애플 리케이션을 개발하고 있으며, URL에서 권한을 가진 간단한 XML 파일을 다운로드해야합니다. 내 로컬 컴퓨터의 [Java 코드]에서 이미 작업중인 것이 있습니다. 내 안드로이드 응용 프로그램에서이 함수를 사용하려고하면 LogCat이 수천 개의 오류를 발생시킵니다. 나는 인터넷 허가를 포함했다, 나는 나의 지위에 오류를 붙일 것이다. 그래서, 내 다운로드 기능을 heres. 이 ... 시간에 따라 변화하지 않기 때문에 내가, Base64로 문자열을 하드 코딩 :XML 파일 안드로이드 오류 다운로드

public String getXmlFromUri(String url) 
{ 
    String strFileContents = new String(""); 
    try{ 
     String base64 = "Basic " + "hardcodedBase64String"; 
     URL pURL = new URL(url); 
     URLConnection conn = pURL.openConnection(); 
     conn.setRequestProperty("Authorization", base64); 
     BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     String data = new String(""); 
     while((data = in.readLine()) != null) 
     { 
      strFileContents += data; 
     } 
     in.close(); 
    }catch(IOException e)  {} 
     if(strFileContents == "") strFileContents = "An error occured or the downloaded file was empty!"; 
    return strFileContents; 
} 

내 로그 캣은 매우 긴, 그래서 내가 페이스트 빈에 그것을 업로드 : http://pastebin.com/DhFra9SG

기능의 밤은은, 예 마무리 나는 현재 승인이 필요한 웹 사이트에서만 사용하고 있습니다.

결론 : 그것은 창문에서 작동하며 안드로이드에서 작동하지 않습니다! 이

답변

2

여기를 그것이 : 당신이 UI (주) 스레드에서 네트워크 작업을 수행하려고하기 때문에
FATAL EXCEPTION: android.os.NetworkOnMainThreadException

그것은 충돌합니다.
네트워크 작업은 장기 실행 작업으로 간주되므로 결과적으로 UI가 차단 될 수 있습니다. 따라서 주 스레드에서 네트워크 작업을 수행하려고하면 API 레벨 11부터 시작하여이 예외가 발생합니다.

장기 실행 작업은 별도의 스레드에서 실행해야합니다. 예를 들어 AsyncTask을 사용하여 서버에서 XML 파일을 가져올 수 있습니다.

+0

허니컴 (3.0)부터 마찬가지입니다. 그러니, 그것을 염두에 두십시오. 주 스레드는 이전 버전의 Android에서는 제한이 적습니다. –

+0

그래서 내 코드를 변경했습니다 : http://pastebin.com/WG0k9Lne 이제 오류가 발생합니다. http://pastebin.com/UB0WTY8a 출력이 "2"로 끝나기 때문에 InputStream is = conn에서 함수가 충돌합니다. .getInputStream(); 표시되어 있습니다. 어떤 아이디어가 이것을 고치는 방법? – user1951516

+0

나는 Console (String) 호출을 삭제해야한다.이 작업을 수행 할 수 없다. P 바보 같은 안드로이드는 나에게별로 화나지 않는다. D – user1951516

0

마지막 코드와 logcat을 기반으로하면 콘솔 메소드를 호출 할 때 문제가 발생합니다. android.view.ViewRootImpl $ CalledFromWrongThreadException : 뷰 계층 구조가 전망을 만질 수 생성 만 원래의 스레드에 의해 발생

.

실제로 doInBackground 메서드에서 일부 View 개체를 변경하거나 추가 할 수 없습니다. UI를 변경하려면 onPreExecute(), onPostExecute (Result) 및 onProgressUpdate (Progress ...) 메소드를 사용해야합니다.

확인 AsyncTask 참조,보다 구체적 4 단계 섹션.

lb

관련 문제