question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

NetworkOnMainThreadException

See original GitHub issue

Hey. I know that there already is lot of similar issues but I cannot find solution. I’ve started working with Espresso UI tests. I prepare custom MockTestRunner, MockApplication for initialization Dagger components and I’ve defined mock modules too. It looks like that:

public class MockTestRunner extends AndroidJUnitRunner {
        public Application newApplication(ClassLoader cl, String className, Context context)
                throws InstantiationException, IllegalAccessException, ClassNotFoundException {
            return super.newApplication(cl, MockMyApplication.class.getName(), context);
        }
 }

MyApp is extended by

public class MockQrApplication extends MyApp {
    private MockWebServer mockWebServer;

    protected void initComponent() {
        mockWebServer = new MockWebServer();

        component = DaggerMyAppComponent
                .builder()
                .myAppModule(new MyAppModule(this))
                .busModule(new BusModule())
                .apiModule(new MockApiModule(mockWebServer))
                .facebookModule(new FacebookModule())
                .dataManagerModule(new DataManagerModule())
                .greenDaoModule(new GreenDaoModule())
                .trackModule(new TrackModule(this))
                .build();

        component.inject(this);
    }
}

I added testInstrumentationRunner into gradle

defaultConfig {
        ....
        multiDexEnabled true

        testInstrumentationRunner "a.b.c.MockTestRunner"
    }

I want run login tests in my LoginActivity

@RunWith(AndroidJUnit4.class)
@LargeTest
public class LoginActivityTest {
    protected Solo solo;

    @Rule
    public ActivityTestRule<LoginActivity> activityTestRule = new ActivityTestRule(LoginActivity.class);

    @Before
    public void setUp() throws Exception {
        initVariables();
    }

    protected void initVariables() {
        solo = new Solo(InstrumentationRegistry.getInstrumentation(), activityTestRule.getActivity());
    }

    @Test
    public void testLayout() {
        solo.waitForFragmentByTag(LoginFragment.TAG, 1000);

        onView(withId(R.id.email_input)).perform(clearText(), typeText("developer@appppp.com"));
        onView(withId(R.id.pass_input)).perform(clearText(), typeText("qqqqqqqq"));
        onView(withId(R.id.login_button)).perform(click());

        solo.waitForDialogToOpen();
    }
}

This is MockApiModule which extends ApiModule class

public class MockApiModule extends ApiModule {
    private MockWebServer mockWebServer;

    public MockApiModule(MockWebServer mockWebServer) {
        this.mockWebServer = mockWebServer;
    }

    @Override
    public OkHttpClient provideOkHttpClient(DataManager dataManager) {
        return new OkHttpClient.Builder()
                .build();
    }

    @Override
    public Retrofit provideRetrofit(OkHttpClient okHttpClient) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(mockWebServer.url("/"))       // throw NetworkOnMainThreadException
                .addConverterFactory(NullOnEmptyConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(okHttpClient)
                .build();
        return retrofit;
    }

    @Override
    public ApiService provideApiService(Retrofit retrofit) {
        return retrofit.create(ApiService.class);
    }

    @Override
    public ApiClient provideApiManager(Application application, ApiService apiService, DataManager dataManager) {
        return new MockApiClient(application, apiService, dataManager, mockWebServer);
    }
}

API login request looks like that:

public void login(UserLoginModel userLoginModel, final Account.Login callback) {
        final CountDownLatch latch = new CountDownLatch(1);

        mockWebServer.enqueue(MockResponse.getMockResponse(200, MockResponse.getResourceAsString(this, "login.json")));

        super.login(userLoginModel, new Account.Login() {
            @Override
            public void onLoginSuccess(LoginResponse response) {
                callback.onLoginSuccess(response);

                latch.countDown();
            }

            @Override
            public void onLoginFail(String message) {

            }
        });

        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

It works if I change MockMyApplication into MyApp class of application in MockTestRunner

When I want to run my tests I got:

android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1285)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getByName(InetAddress.java:305)
at okhttp3.mockwebserver.MockWebServer.start(MockWebServer.java:303)
at okhttp3.mockwebserver.MockWebServer.start(MockWebServer.java:293)
at okhttp3.mockwebserver.MockWebServer.maybeStart(MockWebServer.java:143)
at okhttp3.mockwebserver.MockWebServer.getHostName(MockWebServer.java:172)
at okhttp3.mockwebserver.MockWebServer.url(MockWebServer.java:198)
at com.mooduplabs.qrcontacts.modules.MockApiModule.provideRetrofit(MockApiModule.java:38)
at com.mooduplabs.qrcontacts.modules.ApiModule_ProvideRetrofitFactory.get(ApiModule_ProvideRetrofitFactory.java:23)
at com.mooduplabs.qrcontacts.modules.ApiModule_ProvideRetrofitFactory.get(ApiModule_ProvideRetrofitFactory.java:9)
at dagger.internal.ScopedProvider.get(ScopedProvider.java:46)
at com.mooduplabs.qrcontacts.modules.ApiModule_ProvideApiServiceFactory.get(ApiModule_ProvideApiServiceFactory.java:23)
at com.mooduplabs.qrcontacts.modules.ApiModule_ProvideApiServiceFactory.get(ApiModule_ProvideApiServiceFactory.java:9)
at dagger.internal.ScopedProvider.get(ScopedProvider.java:46)
at com.mooduplabs.qrcontacts.modules.ApiModule_ProvideApiManagerFactory.get(ApiModule_ProvideApiManagerFactory.java:31)
at com.mooduplabs.qrcontacts.modules.ApiModule_ProvideApiManagerFactory.get(ApiModule_ProvideApiManagerFactory.java:11)
at dagger.internal.ScopedProvider.get(ScopedProvider.java:46)
at com.mooduplabs.qrcontacts.activities.BaseActivity_MembersInjector.injectMembers(BaseActivity_MembersInjector.java:44)
at com.mooduplabs.qrcontacts.activities.BaseActivity_MembersInjector.injectMembers(BaseActivity_MembersInjector.java:13)
at com.mooduplabs.qrcontacts.components.DaggerQrContactsAppComponent.inject(DaggerQrContactsAppComponent.java:91)
at com.mooduplabs.qrcontacts.activities.BaseActivity.init(BaseActivity.java:74)
at com.mooduplabs.qrcontacts.activities.BaseActivity.onCreate(BaseActivity.java:64)
at android.app.Activity.performCreate(Activity.java:6367)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:532)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2404)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2511)
at android.app.ActivityThread.access$900(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1375)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5621)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

Issue Analytics

  • State:closed
  • Created 7 years ago
  • Comments:10 (2 by maintainers)

github_iconTop GitHub Comments

18reactions
RafalMankacommented, Feb 11, 2019

If anyone else stumbles on this problem here is the solution. Modify your custom AndroidJUnitRunner like so:

class EspressoRunner : AndroidJUnitRunner() {

    override fun onCreate(arguments: Bundle) {
        StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder().permitAll().build())
        super.onCreate(arguments)
    }

    ...

}

copied from this article.

6reactions
DavidEdwardscommented, Feb 23, 2017

@rusmichal

If you are confused about threading, you should take a look at this:

http://stackoverflow.com/questions/6343166/how-to-fix-android-os-networkonmainthreadexception

There are some good explanations, and some solutions.

Read more comments on GitHub >

github_iconTop Results From Across the Web

How can I fix 'android.os.NetworkOnMainThreadException'?
This exception occurs due to any heavy task performed on the main thread if that performing task takes too much time. To avoid...
Read more >
NetworkOnMainThreadException - Android Developers
On this page; Summary. Public constructors; Inherited methods. Public constructors. NetworkOnMainThreadException. Android Developers.
Read more >
How to Fix 'android.os.NetworkOnMainThreadException'?
Well, this article has the perfect solution on how to get rid of that 'android.os.NetworkOnMainThreadException' error! Read to fix it!
Read more >
How to fix android.os.NetworkOnMainThreadException?
The exception that is thrown when an application attempts to perform a networking operation on its main thread.
Read more >
How to fix android.os.NetworkOnMainThreadException error
A NetworkOnMainThreadException is thrown when an app attempts to perform networking operations on the main thread. The error appears on all applications ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found