Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么访问电子表格时会出现网络主线程异常?_Android_Networking_Spreadsheet - Fatal编程技术网

Android 为什么访问电子表格时会出现网络主线程异常?

Android 为什么访问电子表格时会出现网络主线程异常?,android,networking,spreadsheet,Android,Networking,Spreadsheet,我遇到了很多异常,比如NetworkMainthread。是的,我遵循了 公共类MainActivity扩展活动{ @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 字符串用户名=”xyz@gmail.com"; 字符串密码=“rrrrr”; URL电子表格\u提要\u URL=null; 试一试{ 电子表格

我遇到了很多异常,比如NetworkMainthread。是的,我遵循了

公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
字符串用户名=”xyz@gmail.com";
字符串密码=“rrrrr”;
URL电子表格\u提要\u URL=null;
试一试{
电子表格\u提要\u URL=新URL(“https://spreadsheets.google.com/feeds/spreadsheets/private/full");
/*https://spreadsheets.google.com/feeds/spreadsheets/public/full");*/
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
电子表格服务=新的电子表格服务(“MySpreadsheetIntegration-v1”);
setProtocolVersion(SpreadsheetService.Versions.V3);
试一试{
service.setUserCredentials(用户名、密码);
}捕获(身份验证异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
SpreadsheetFeed=null;
试一试{
feed=service.getFeed(电子表格\u feed\u URL,SpreadsheetFeed.class);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(服务异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
列表电子表格=feed.getEntries();
电子表格输入电子表格=电子表格.get(0);
System.out.println(电子表格.getTitle().getPlainText());
WorksheetFeed WorksheetFeed=null;
试一试{
worksheetFeed=service.getFeed(
电子表格.getWorksheetFeedUrl(),WorksheetFeed.class);
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}捕获(服务异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
List worksheets=worksheetFeed.getEntries();
WorksheetEntry工作表=worksheets.get(0);
URL listFeedUrl=工作表。getListFeedUrl();
ListFeed ListFeed=null;
试一试{
listFeed=service.getFeed(listFeedUrl,listFeed.class);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(服务异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
List List=listFeed.getEntries();
用于(列表输入行:列表){
System.out.println(row.getTitle().getPlainText()+“\t”+row.getPlainTextContent());
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}

}

看看这篇文章-。

由于Android 4.0,所有网络请求都应在单独的线程中执行,否则将发生异常。

NetWorkOnMaiNThread异常是因为您试图在主UI线程中执行与网络相关的操作。这是不可能的

如果asynctask持续时间较短,则可以使用它

以上链接的引用

理想情况下,异步任务应用于短期操作(最多几秒钟)。

您可以在onPreExecute()中显示progressdialog。在doInBackground()中执行与网络相关的操作。但不要从doInBackground()更新ui(doInBackground()在后台线程上运行)。在doInBackground()中返回结果。doInBackground()的结果是onPostExecute()的参数。在onPostExecute()中关闭对话框并相应地更新ui

您还可以创建线程并执行与网络相关的操作。如果创建线程,则需要小心不要从线程更新ui。ui应在主ui线程上更新


Android 3.0以后版本不支持在主UI线程中进行网络调用。 您可以使用Thread或AsyncTask来实现网络调用


谢谢

这不推荐,但有帮助

if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }
if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }