Je fais des appels réseau à partir d'un IntentService mais je reçois toujours une exception NetworkOnMainThreadException. Ma compréhension est qu'un IntentService fonctionne toujours sur un thread de travail, donc je suis surpris de voir cela. L'élément crucial peut être que mon IntentService appelle une classe d'assistance statique qui effectue les appels réseau. La classe d'assistance statique est instanciée dans ma classe Application principale.NetworkOnMainThreadException dans IntentService
Je pensais que cela s'exécuterait toujours sur le thread de travail du IntentService. Qu'est-ce que je rate? Honnêtement, je préfère les discussions informatives capitales sur un correctif de code rapide. Mais si le code est nécessaire, le code doit être fourni:
//MyApplication.java
public class MyApplication extends Application{
private static NetworkUtils utils;
@Override
public void onCreate() {
super.onCreate();
utils = new NetworkUtils(this);
...
}
...
}
//NetworkUtils.java
public class NetworkUtils {
private static Context context;
private static final Gson gson = new Gson();
public NetworkUtils(Context context) {
this.context = context;
}
public static final DataResponse login(String email, String password) {
//*** NetworkOnMainThreadException OCCURS HERE ***
DataResponse response = HttpConnection.put(url, json);
...
return response;
}
...
}
//LoginService.java
public class LoginService extends IntentService {
public LoginService() {
super("LoginService");
}
@Override
public void onStart(Intent intent, int startId) {
onHandleIntent(intent);
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle bundle = new Bundle();
DataResponse response = NetworkUtils.login(email, password);
...
bundle.putBoolean(MyConstants.ExtraKeys.LOGGED, response.success);
MainApplication.getApplicationInstance().sendBroadCast(MyConstants.Actions.LOGIN, bundle);
}
}
//LoginActivity.java
public class LoginActivity extends ActionBarActivity implements IDialogClickListener {
...
public void onLoginButtonPressed() {
Intent intent = new Intent(MainApplication.getApplicationInstance(), LoginService.class);
this.startService(intent);
}
}
Aussi, Logcat:
> 04-01 18:20:41.048: VERBOSE/com.foo.foo(28942):
> com.foo.foo.network.HttpConnection.execute - METHOD: PUT
> 04-01 18:20:41.068: ERROR/com.foo.foo(28942):
> com.foo.foo.social.NetworkUtils.login - class
> android.os.NetworkOnMainThreadException: null
> 04-01 18:20:41.169: DEBUG/com.foo.foo(28942):
> com.foo.foo.MainActivity$MyReceiver.onReceive - BROADCAST RECEIVED:
> [email protected] - Intent { act=com.foo.foo.login
> dat=com.foo.foo.scheme://data/1364854841079 (has extras) }
> 04-01 18:20:41.169: INFO/com.foo.foo(28942):
> com.foo.foo.activity.LoginActivity.setData - ACTION: com.foo.foo.login
> - ISERROR: true
SOLUTION
La question sous-jacente était un peu de code hérité qui appelle onHandleIntent
explicitement . Dans LoginService.java ci-dessus:
@Override
public void onStart(Intent intent, int startId) {
onHandleIntent(intent);
}
Ceci est à l'origine du code onHandleIntent à exécuter sur le thread principal, comme on l'appelle de l'événement onStart (qui se déroule apparemment thread principal).
Il vous manque une partie de votre code pour que nous puissions voir ce qui se passe. S'il vous plaît poster du code, la sortie logcat, et pointez sur la ligne de l'erreur vient. – MCeley