我在为RssReader运行我的Android项目时遇到错误.
码:
URL url = new URL(urlToRssFeed);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
RssHandler theRSSHandler = new RssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSource is = new InputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();
Run Code Online (Sandbox Code Playgroud)
它显示以下错误:
android.os.NetworkOnMainThreadException
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我有这个例外,我正在阅读这个问题的线程,这看起来很混乱:
如何修复android.os.NetworkOnMainThreadException?
我已将此行添加到我的清单中:
<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)
在讨论中,他们讨论了应用程序无法进行网络连接的主要执行线程.我想知道的是如何重构我的代码,以便它与Android良好实践一致.
这是我的Activity类:
package com.problemio;
import java.io.InputStream;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class LoginActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
// Show form for login_email
final EditText loginEmail = (EditText) findViewById(R.id.login_email);
String name = loginEmail.getText().toString();
// Show field for password
final EditText password …
Run Code Online (Sandbox Code Playgroud) 我刚刚在官方文档中发现了NetworkOnMainThreadException
并想知道模拟器是否抛出这个.我一直在测试我的应用程序,据我所知,所有网络都是主线程(使用Roboguice RoboAsyncTask),但你永远不知道是否有人没有逃脱.
我也在使用StrictMode并且没有看到任何东西.
我的代码是干净的还是不会在模拟器上抛出?
我们应该如何为生产中的这种情况做好准备?
宽限期或其他什么?或者现在已经过去了;-) ??
networking android asynchronous android-asynctask networkonmainthread
我想在Android中使用OkHttp库进行网络连接.我从他们网站上写的简单帖子示例开始:
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
Run Code Online (Sandbox Code Playgroud)
通过这个电话:
String response = post("http://www.roundsapp.com/post", json);
Run Code Online (Sandbox Code Playgroud)
此调用以NetworkOnMainThreadException结束.
我可以使用AsyncTask包装调用,但据我从示例中了解,OkHttp库应该已经处理过了.我做错了什么?
嗨所有的观众和读者,我正在使用链接.每当我在单独的包中运行此代码时,它工作正常,但每当我尝试在我的应用程序中嵌入此示例时,得到遗憾的应用程序已停止,只有当我单击选项卡时调用它的特定选项卡,并且Logcat说: -
Caused by: android.os.NetworkOnMainThreadException
10-30 15:07:35.341: E/AndroidRuntime(732): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117),
Run Code Online (Sandbox Code Playgroud)
请告诉我我需要做什么使它对我有用,除了这个特定的选项卡整个应用程序工作正常.
10-30 15:07:26.770: D/dalvikvm(732): GC_FOR_ALLOC freed 61K, 3% free 8035K/8259K, paused 39ms, total 46ms
10-30 15:07:26.781: I/dalvikvm-heap(732): Grow heap (frag case) to 8.481MB for 614416-byte allocation
10-30 15:07:26.850: D/dalvikvm(732): GC_CONCURRENT freed 1K, 4% free 8634K/8903K, paused 27ms+13ms, total 71ms
10-30 15:07:26.881: D/dalvikvm(732): GC_FOR_ALLOC freed 0K, 4% free 8634K/8903K, paused 28ms, total 28ms
10-30 15:07:26.900: I/dalvikvm-heap(732): Grow heap (frag case) to 9.798MB for 1382416-byte allocation
10-30 15:07:26.970: D/dalvikvm(732): GC_CONCURRENT …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个分配项目,我是Android的新手,我想从非常常见的URL访问json http://api.androidhive.info/contacts/
,
问题:我正在尝试读取url并获取并解析此url返回的json,
我已经在我的AndroidManifest.xml中添加了以下行
<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)
首选项:和我的Android首选项是
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
Run Code Online (Sandbox Code Playgroud)
这就是我试图读取网址的方式
static InputStream is = null;
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
Run Code Online (Sandbox Code Playgroud)
错误消息
11-02 05:23:47.843: E/AndroidRuntime(2207): FATAL EXCEPTION: main
11-02 05:23:47.843: E/AndroidRuntime(2207): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.me.countrypedia/com.me.countrypedia.MainActivity}: android.os.NetworkOnMainThreadException
11-02 05:23:47.843: E/AndroidRuntime(2207): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-02 05:23:47.843: E/AndroidRuntime(2207): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-02 05:23:47.843: E/AndroidRuntime(2207): at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-02 05:23:47.843: E/AndroidRuntime(2207): at …
Run Code Online (Sandbox Code Playgroud) 我一直试图在上周左右开始工作,但仍然不知道问题是什么.它适用于Android 2.1但不适用于4.1.我已经在服务中找到了这个字符串,检查我的应用程序中的更新.
latestVersion = Integer.parseInt(getHttpString(urlLatestVersion));
Run Code Online (Sandbox Code Playgroud)
它在checkForUpdate()中调用; 在onStart中调用(Intent intent,int startId);.
private String getHttpString(String urlString) throws IOException {
InputStream in = null;
int response = -1;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection))
throw new IOException("Not an HTTP connection");
try {
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
}
} catch (Exception ex) {
ex.printStackTrace();
//
//main error currently lies here
// TODO …
Run Code Online (Sandbox Code Playgroud) android onstart httpurlconnection android-asynctask networkonmainthread
我需要执行第三方开源程序,它抛出NetworkOnMainThreadException.根据SDK参考,仅针对Honeycomb SDK或更高版本的应用程序进行此操作.针对早期SDK版本的应用程序可以在其主要事件循环线程上进行联网.
在第一阶段,我只想运行程序,而不更改源.所以,我改变了AndroidManifesr.xml中的行:
android:targetSdkVersion="15"
至:
android:targetSdkVersion="10"
但是,这没有用,程序仍然会抛出NetworkOnMainThreadException.我怎样才能使这个工作?我正在尝试在Android Emulation Google API上执行该程序(级别16).
我目前正在使用Phonegap 1.6.0和Sencha Touch 1.1创建一个应用程序.最近,在使用Android 4.0.4的智能手机上进行测试时,我们发现Facebook登录并没有像预期的那样完全正常工作.我们正在使用位于此处的Phonegap Facebook插件和Cordova补丁.会发生的是,一旦我们尝试使用Android Honeycomb或更高版本的智能手机登录Facebook,该应用程序就会启动NetworkOnMainThreadException,因为主线程上不允许进行网络操作.此异常仅在Android Honeycomb或更高版本上引发,这就是我们在2.3.3上没有注意到的原因.调用FB.login()并且未达到回调时抛出异常.
我检查了各种线程和主题,但都非常模糊.我知道我必须在一个单独的线程中运行网络操作,但我不确定应该怎么做.线程似乎发生在Java中,但我根本就没有使用任何Java,所以在使用非我编写的代码进行修改之前,我想要一些帮助.
我将稍后尝试缩小导致异常的部分.任何帮助,将不胜感激.
错误堆栈:
05-25 15:42:29.018: I/Web Console(3785): Cordova Facebook Connect plugin initialized successfully. at file:///android_asset/www/cdv-plugin-fb-connect.js:24
05-25 15:42:29.120: D/OpenGLRenderer(3785): Flushing caches (mode 0)
05-25 15:42:30.479: D/ConnectPlugin(3785): authorized
05-25 15:42:30.479: D/ConnectPlugin(3785): Bundle[{expires_in=5177550, access_token=censored, code=censored}]
05-25 15:42:30.503: D/AndroidRuntime(3785): Shutting down VM
05-25 15:42:30.503: W/dalvikvm(3785): threadid=1: thread exiting with uncaught exception (group=0x40a671f8)
05-25 15:42:30.511: E/AndroidRuntime(3785): FATAL EXCEPTION: main
05-25 15:42:30.511: E/AndroidRuntime(3785): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=32665, result=-1, data=Intent { (has extras) …
Run Code Online (Sandbox Code Playgroud) 在Android上尝试我的全新服务之后我得到了这个:
我猜是与清单文件和权限相关的东西,服务在最后一个活动之后启动,更新服务器上的数据并检索新数据并在android上的sqlite上保存id:
这里还有清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ggservice.democracy"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.ggservice.democracy.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:label="@string/app_name" android:name="com.ggservice.democracy.sondaggioActivity"/>
<activity android:label="@string/app_name" android:name="com.ggservice.democracy.domandeDiCategoria"/>
<service android:name="com.ggservice.democracy.updateDemocracyService" />
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
logcat:
01-02 15:33:30.960: W/dalvikvm(2570): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
01-02 15:33:31.160: E/AndroidRuntime(2570): FATAL EXCEPTION: main
01-02 15:33:31.160: E/AndroidRuntime(2570): java.lang.RuntimeException: Unable to start service com.ggservice.democracy.updateDemocracyService@412f0c60 with Intent { cmp=com.ggservice.democracy/.updateDemocracyService }: android.os.NetworkOnMainThreadException
01-02 15:33:31.160: E/AndroidRuntime(2570): …
Run Code Online (Sandbox Code Playgroud)