2013-01-05 67 views
0

我正在开发一个android应用程序,我需要从url下载一些简单的XML文件的授权。我已经在我的本地计算机上用java工作了[代码结束]。当我尝试在我的android应用程序中使用此功能时,LogCat会抛出数千个错误。我包括互联网许可,我会将错误附加到我的帖子中。 因此,继承我的下载功能。我硬编码以base64字符串,因为它不会随着时间而改变......:下载XML文件android错误

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; 
} 

我logcat的是很长,所以我上传的引擎收录:http://pastebin.com/DhFra9SG

功能心不是结束,是的,我目前只在需要授权的网站上使用它。

总结:它在Windows上工作,它不适用于Android! 它

回答

2

这就是:
FATAL EXCEPTION: android.os.NetworkOnMainThreadException

它崩溃,因为你总是试图在UI(主)线程执行网络操作。
网络操作被认为是长时间运行的操作,因此他们可能会阻止用户界面。因此,如果您尝试在主线程上执行网络操作,则从API Level 11开始,将抛出此异常。

长时间运行操作应该在单独的线程中运行,例如,您可以使用AsyncTask从服务器获取XML文件。

+0

Honeycomb(3.0)就是这样。所以,牢记这一点。主线程在Android的旧版本中受到较少的限制。 –

+0

所以我改变了我的代码:http://pastebin.com/WG0k9Lne 现在我得到这些错误:http://pastebin.com/UB0WTY8a 输出结束于“2”,所以在InputStream上的函数崩溃= conn .getInputStream();如标记。任何想法如何解决这一问题? – user1951516

+0

我得到它的工作,不得不删除控制台(字符串)调用......它不允许这样做:P愚蠢的机器人使得我很小很生气:D – user1951516

0

基于您的最后一段代码和logcat,问题来自Console方法的调用。

产生的原因:android.view.ViewRootImpl $ CalledFromWrongThreadException: 只有创建视图层次可以触摸它 享有原来的线程。

实际上,您不能从doInBackground方法更改/添加一些View对象。如果要更改UI,它必须来自onPreExecute(),onPostExecute(Result)和onProgressUpdate(Progress ...)方法。

检查AsyncTask参考,并且更具体的4个步骤部分

BR