Sto effettuando chiamate di rete da un IntentService ma continuo a ricevere NetworkOnMainThreadException. La mia comprensione è che un IntentService viene sempre eseguito su un thread di lavoro, quindi sono sorpreso di vedere questo. Il punto cruciale potrebbe essere che il mio IntentService chiama una classe helper statica che esegue le chiamate di rete. La classe helper statica è istanziata nella mia principale classe Application.NetworkOnMainThreadException in IntentService
Ho pensato che sarebbe ancora eseguito sul thread di lavoro di IntentService. Cosa mi manca?
Sinceramente preferisco discussioni informative inebrianti su una correzione rapida del codice. Ma se è richiesto il codice, deve essere fornita di codice:
//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);
}
}
Inoltre, 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
SOLUZIONE
La questione di fondo era un po 'di codice legacy che stava chiamando onHandleIntent
esplicitamente . In LoginService.java sopra:
@Override
public void onStart(Intent intent, int startId) {
onHandleIntent(intent);
}
Ciò causa il codice onHandleIntent eseguire sul thread principale, come viene chiamato dall'evento onStart (che funziona apparentemente thread principale).
Ti manca parte del codice in modo che possiamo vedere cosa sta succedendo. Si prega di inviare un po 'di codice, l'output logcat e puntare alla riga da cui proviene l'errore. – MCeley