При анализе ответа JSON с использованием библиотеки Okhttp и GSON я получаю исключение сети в основном потоке.

Я дал зависимости в моем файле проекта gradle, которые приведены ниже.

скомпилировать 'com.google.code.gson:gson:2.4'

скомпилировать 'com.squareup.okhttp3:okhttp:3.1.2'

Я получаю исключение android.os.NetwokOnMainThreadException

Я не могу понять, как решить эту проблему, потому что я уже просматриваю форму рецептов OKHTTP, приведенную ниже по ссылке. https://github.com/square/okhttp/wiki/Рецепты

    public class MainActivity extends AppCompatActivity {

    private final OkHttpClient client = new OkHttpClient();
    private final Gson gson = new Gson();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            Request request = new Request.Builder()
                    .url("https://api.github.com/gists/c2a7c39532239ff261be")
                    .build();
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful())
                Toast.makeText(getApplicationContext(),"false",Toast.LENGTH_LONG).show();

            Gist gist = gson.fromJson(response.body().charStream(), Gist.class);
            for (Map.Entry<String, GistFile> entry : gist.files.entrySet()) {
                Toast.makeText(getApplicationContext(),entry.getKey().toString(),Toast.LENGTH_LONG).show();
            }
        }catch (Exception e){
            Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_LONG).show();
        }
    }

    static class Gist {
        Map<String, GistFile> files;
    }

    static class GistFile {
        String content;
    }

}

person SourabhTech    schedule 09.03.2016    source источник
comment
используйте асинхронную задачу или поток для запуска сетевого вызова, вы не должны запускать сетевые вызовы в потоке пользовательского интерфейса   -  person Pankaj Nimgade    schedule 09.03.2016
comment
Согласно документам OkHttp: он поддерживает как синхронные блокирующие вызовы, так и асинхронные вызовы с обратными вызовами. Я знаю, что в Android с версии 3.0 выдается это исключение, если вы пытаетесь выполнить сетевые вызовы в основном потоке. Используя Госн или модификацию, вы можете выполнить эту задачу. А также, если я хочу написать код задачи asynk, то почему я буду использовать okhhtp.   -  person SourabhTech    schedule 09.03.2016
comment
отметьте это, также выдайте Logcat ошибок   -  person ELITE    schedule 09.03.2016
comment
@ELITE правильно объясните, напишите свой код в AsyncTask..   -  person    schedule 09.03.2016
comment
@ ELITE @PAnkaj Пожалуйста , просмотрите ссылку , которая дана ниже . Я надеюсь, что после прочтения вы лучше поймете, для чего нужен OKHTTP. stackoverflow.com/questions/28135338/   -  person SourabhTech    schedule 09.03.2016
comment
@ELITE OkHttp имеет асинхронную очередь с обратным вызовом, который намного эффективнее.   -  person SourabhTech    schedule 09.03.2016
comment
@SourabhTech, вы поняли, я не использовал OkHttp, просто хотел сообщить вам об ошибке, которую вы получаете   -  person Pankaj Nimgade    schedule 09.03.2016
comment
Почему закрыть голосование не могли бы вы объяснить.   -  person SourabhTech    schedule 09.03.2016
comment
Потому что есть тысячи вопросов о NetworkOnMainThreadException, и если бы вы использовали call.enqueue() вместо call.execute(), у вас даже не было бы этой проблемы.   -  person EpicPandaForce    schedule 10.03.2016


Ответы (1)


Используйте enqueue() вместо execute().

Execute запускает его в том же потоке (который в данном случае является потоком пользовательского интерфейса).

Enqueue запускает его в фоновом потоке.

Вы хотите вызывать сетевые операции в фоновом потоке, а НЕ в потоке пользовательского интерфейса.

См. интерфейс Call здесь.

person EpicPandaForce    schedule 10.03.2016