IntentService中的NetworkOnMainThreadException

cli*_*hir 9 android static-methods intentservice

我正在从IntentService进行网络调用,但仍然收到NetworkOnMainThreadException.我的理解是IntentService总是在工作线程上运行,所以我很惊讶看到这一点.关键部分可能是我的IntentService正在调用执行网络调用的静态助手类.静态助手类在我的主Application类中实例化.

我以为这仍然会在IntentService的工作线程上执行.我错过了什么?

老实说,我更喜欢通过快速代码修复进行冗长的信息讨论.但如果需要代码,则应提供代码:

//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);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,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:
>     com.foo.foo.MainApplication@422d81d8 - 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
Run Code Online (Sandbox Code Playgroud)

潜在的问题是一些onHandleIntent明确调用的遗留代码.在上面的LoginService.java中:

@Override 
public void onStart(Intent intent, int startId) { 
    onHandleIntent(intent); 
} 
Run Code Online (Sandbox Code Playgroud)

这导致onHandleIntent代码在主线程上运行,因为它是从onStart事件(显然在主线程上运行)调用的.

cli*_*hir 5

我发现了这个问题.在上面的LoginService.java中查看这个令人困惑的覆盖:

@Override 
public void onStart(Intent intent, int startId) { 
    onHandleIntent(intent); 
} 
Run Code Online (Sandbox Code Playgroud)

这导致onHandleIntent代码在主线程上运行,因为它是从onStart事件(显然在主线程上运行)调用的.我很想阅读开发人员的想法!