我正在开发一个Android应用程序,我需要从网址下载一些简单的XML文件。我已经在我的本地计算机上使用java工作了[最后的代码]。当我尝试在我的Android应用程序中使用此功能时,LogCat会引发数以千计的错误。我包含了Internet权限,我会将错误附加到我的帖子中。 那么,继承我的下载功能。我硬编码了base64字符串,因为它不会随着时间而改变......:
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很长,所以我上传到了pastebin:http://pastebin.com/DhFra9SG
该功能尚未完成,我目前仅在需要授权的网站上使用它。
总结:它适用于Windows,它不适用于Android! 它
答案 0 :(得分:2)
这是:
FATAL EXCEPTION: android.os.NetworkOnMainThreadException
崩溃是因为您尝试在UI(主)线程上执行网络操作 网络操作被认为是长时间运行的操作,因此它们可能会阻止UI。因此,如果您尝试在主线程上执行网络操作,则从API Level 11开始,抛出此异常。
长时间运行的操作应该在一个单独的线程中运行,例如,您可以使用AsyncTask从服务器获取XML文件。
答案 1 :(得分:0)
基于最后一段代码和logcat,问题来自于调用Console方法。
引起:android.view.ViewRootImpl $ CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触及它 视图。
实际上,您无法从doInBackground方法更改/添加一些View对象。如果要更改UI,则必须来自onPreExecute(),onPostExecute(Result)和onProgressUpdate(Progress ...)方法。
检查 AsyncTask 参考,更具体地说, 4个步骤。
BR