Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
danilshik
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
1

Ошибка NetworkOnMainThreadException

27.04.2017, 15:46. Просмотров 400. Ответов 6
Метки нет (Все метки)

Всем привет, делаю приложку по примерам. В качестве БД используется MySQL. Никак не пойму в чем ошибка. Скорее всего в JSONParser, так как исходного JSONParser у меня нет. Приложение просто закрывается
FirstActiviry
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
ackage com.example.danilshik.kurs2;
 
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
/*import com.devcolibri.parser.JSONParser;*/
 
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
 
public class FirstActivity extends AppCompatActivity {
    EditText txtName;
    EditText txtLocation;
    Button btnSave;
    Button btnDelete;
 
    String user_id;
 
    private ProgressDialog pDialog;
 
    JSONParser jsonParser = new JSONParser();
 
    // url для получения одного продукта
    private static final String url_users_details = "http://test2.ru/get_users_details.php";
 
    // url для обновления продукта
    private static final String url_update_users = "http://test2.ru/update_users.php";
 
    // url для удаления продукта
    private static final String url_delete_users = "http://test2.ru/delete_users.php";
 
    // JSON параметры
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_USERS = "users";
    private static final String TAG_USERID = "user_id";
    private static final String TAG_NAME = "name";
    private static final String TAG_LOCATION="location";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        /* static final int NOTIFY_ID=101; //идентификатор уведомления*/
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        /*buttonToast=(Button)findViewById(R.id.buttonToast);
        buttonUv=(Button)findViewById(R.id.buttonUv);
 
        //всплывающее сообщение
        buttonToast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 
 
                Toast toast = Toast.makeText(getApplicationContext(), "Изменилось значение поля в БД",Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                startActivity(intent); //запуска 2 layot
            }
        });*/
        btnSave = (Button) findViewById(R.id.btnSave);
        btnDelete = (Button) findViewById(R.id.btnDelete);
        // показываем форму про детальную информацию о продукте
        Intent i = getIntent();
        // получаем id продукта (pid) с формы
        user_id = i.getStringExtra(TAG_USERID);
        // Получение полной информации о продукте в фоновом потоке
        new GetProductDetails().execute();
        // обрабочик на кнопку сохранение продукта
        btnSave.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View arg0) {
                // запускаем выполнение задачи на обновление продукта
                new SaveProductDetails().execute();
            }
        });
        // обработчик на кнопку удаление продукта
        btnDelete.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View arg0) {
                // удалем продукт в фоновом потоке
                new DeleteProduct().execute();
            }
        });
 
 
    }
    /**
     * Фоновая асинхронная задача для получения полной информации о продукте
     **/
    class GetProductDetails extends AsyncTask<String, String, String> {
 
        /**
         * Перед началом показать в фоновом потоке прогресс диалог
         **/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(FirstActivity.this);
            pDialog.setMessage("Загрузка информации о пользователе. Пожалуйста, подождите");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
 
        /**
         * Получение детальной информации о продукте в фоновом режиме
         **/
        protected String doInBackground(String[] params) {
 
            // обновляем UI форму
            runOnUiThread(new Runnable() {
                public void run() {
                    // проверяем статус success тега
                    int success;
                    try {
                        // Список параметров
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("user_id", user_id));
 
                        // получаем продукт по HTTP запросу
                        JSONObject json = jsonParser.makeHttpRequest(url_users_details, "GET", params);
 
                        Log.d("Single Product Details", json.toString());
 
                        success = json.getInt(TAG_SUCCESS);
                        if (success == 1) {
                            Toast toast = Toast.makeText(getApplicationContext(), "Успешно получена информация о продукте",Toast.LENGTH_SHORT);
                            toast.setGravity(Gravity.CENTER, 0, 0);
                            toast.show();
 
                            // Успешно получинна детальная информация о продукте
                            JSONArray usersObj = json.getJSONArray(TAG_USERS);
 
                            // получаем первый обьект с JSON Array
                            JSONObject users = usersObj.getJSONObject(0);
 
                            // продукт с userid найден
                            // Edit Text
                            txtName = (EditText) findViewById(R.id.inputName);
                            txtLocation = (EditText) findViewById(R.id.inputLocation);
 
 
                            // показываем данные о продукте в EditText
                            txtName.setText(users.getString(TAG_NAME));
                            txtLocation.setText(users.getString(TAG_LOCATION));
 
 
                        }else{
                            // продукт с userid не найден
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
 
            return null;
        }
 
        /**
         * После завершения фоновой задачи закрываем диалог прогресс
         **/
        protected void onPostExecute(String file_url) {
            // закрываем диалог прогресс
            pDialog.dismiss();
        }
    }
 
    /**
     * В фоновом режиме выполняем асинхроную задачу на сохранение продукта
     **/
    class SaveProductDetails extends AsyncTask<String, String, String> {
 
        /**
         * Перед началом показываем в фоновом потоке прогресс диалог
         **/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(FirstActivity.this);
            pDialog.setMessage("Сохранение продукта ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
 
        /**
         * Сохраняем продукт
         **/
        protected String doInBackground(String[] args) {
 
            // получаем обновленные данные с EditTexts
            String name = txtName.getText().toString();
            String location = txtLocation.getText().toString();
 
            // формируем параметры
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair(TAG_USERID, user_id));
            params.add(new BasicNameValuePair(TAG_NAME, name));
            params.add(new BasicNameValuePair(TAG_LOCATION, location));
 
            // отправляем измененные данные через http запрос
            JSONObject json = jsonParser.makeHttpRequest(url_update_users, "POST", params);
 
            // проверяем json success тег
            try {
                int success = json.getInt(TAG_SUCCESS);
 
                if (success == 1) {
                    // продукт удачно обноалён
                    Intent i = getIntent();
                    // отправляем результирующий код 100 чтобы сообщить об обновлении продукта
                    setResult(100, i);
                    finish();
                } else {
                    // продукт не обновлен
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }
 
        /**
         * После окончания закрываем прогресс диалог
         **/
        protected void onPostExecute(String file_url) {
            // закрываем прогресс диалог
            pDialog.dismiss();
        }
    }
 
    /**
     * Фоновая асинхронная задача на удаление продукта
     **/
    class DeleteProduct extends AsyncTask<String, String, String> {
 
        /**
         * На начале показываем прогресс диалог
         **/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(FirstActivity.this);
            pDialog.setMessage("уДАЛЕМ ПРОДУКТ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
 
        /**
         * Удаление продукта
         **/
        protected String doInBackground(String[] args) {
 
            int success;
            try {
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("users_id", user_id));
 
                // получение продукта используя HTTP запрос
                JSONObject json = jsonParser.makeHttpRequest(url_delete_users, "POST", params);
 
                Log.d("Delete Product", json.toString());
 
                success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    // Продукт удачно удален
                    Intent i = getIntent();
                    // отправляем результирующий код 100 для уведомления об удалении продукта
                    setResult(100, i);
                    finish();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }
 
        /**
         * После окончания скрываем прогресс диалог
         **/
        protected void onPostExecute(String file_url) {
            pDialog.dismiss();
        }
    }
}

JSONParser
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.example.danilshik.kurs2;
 
/**
 * Created by Danilshik on 27.04.2017.
 */
 
 
 
        import android.util.Log;
        import org.apache.http.HttpEntity;
        import org.apache.http.HttpResponse;
        import org.apache.http.NameValuePair;
        import org.apache.http.client.ClientProtocolException;
        import org.apache.http.client.entity.UrlEncodedFormEntity;
        import org.apache.http.client.methods.HttpGet;
        import org.apache.http.client.methods.HttpPost;
        import org.apache.http.client.utils.URLEncodedUtils;
        import org.apache.http.impl.client.DefaultHttpClient;
        import org.json.JSONException;
        import org.json.JSONObject;
 
        import java.io.*;
        import java.util.List;
 
public class JSONParser {
 
 
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
 
    // constructor
    public JSONParser() {
 
    }
 
    // function get json from url
// by making HTTP POST or GET method
    public JSONObject makeHttpRequest(String url, String method, List params) {
 
// Making HTTP request
        try {
 
// check for request method
            if(method == "POST"){
// request method is POST
// defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity (params));
 
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
 
            }else if(method == "GET"){
// request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format (params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);
 
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }
 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader (
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e ("Buffer Error", "Error converting result" + e.toString ());
        }
 
// try parse the string to a JSON object
        try {
            jObj = new JSONObject (json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
 
// return JSON String
        return jObj;
 
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2017, 15:46
Ответы с готовыми решениями:

NetworkOnMainThreadException
При отправке Socket'а выбрасывает NetworkOnMainThreadException. Код активити: package...

Android.os.networkonmainthreadexception
Суть дела: Написал методы для того, чтобы отпарсить xml по url. Вроде бы все ок, но выскакивает...

Исключение NetworkOnMainThreadException
response.body().string() библиотеки okHttp выдает исключение NetworkOnMainThreadException если это...

Android.os.NetworkOnMainThreadException при создании сокета
Доброго времени суток товарищи. Возникла очень серьезная проблемма. Решил я сделать сетевой чат. ...

NetworkOnMainThreadException при сохранении картинки в битовый массив
Беру данные с веб сайта как JSON и созраняю в базу данных sqlite. Собираюсь созранять картинку как...

6
danilshik
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
27.04.2017, 15:50  [ТС] 2
Лог
04-27 12:48:07.635 2733-2733/? I/art: Not late-enabling -Xcheck:jni (already on)
04-27 12:48:07.712 2733-2733/com.example.danilshik.kurs2 I/InstantRun: Instant Run Runtime started. Android package is com.example.danilshik.kurs2, real application class is null.
04-27 12:48:07.851 2733-2733/com.example.danilshik.kurs2 W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
04-27 12:48:08.018 2733-2753/com.example.danilshik.kurs2 D/OpenGLRenderer: Render dirty regions requested: true

[ 04-27 12:48:08.022 2733: 2733 D/ ]
HostConnection::get() New Host Connection established 0x7fdab2d8f800, tid 2733
04-27 12:48:08.026 2733-2733/com.example.danilshik.kurs2 D/Atlas: Validating map...

[ 04-27 12:48:08.111 2733: 2753 D/ ]
HostConnection::get() New Host Connection established 0x7fdaaa02b180, tid 2753
04-27 12:48:08.114 2733-2753/com.example.danilshik.kurs2 I/OpenGLRenderer: Initialized EGL, version 1.4
04-27 12:48:08.115 2733-2753/com.example.danilshik.kurs2 W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
04-27 12:48:08.184 2733-2753/com.example.danilshik.kurs2 D/OpenGLRenderer: Enabling debug mode 0
04-27 12:48:08.347 2733-2733/com.example.danilshik.kurs2 D/AndroidRuntime: Shutting down VM
04-27 12:48:08.348 2733-2733/com.example.danilshik.kurs2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.danilshik.kurs2, PID: 2733
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.example.danilshik.kurs2.JSONParser.makeHttpRequest(JSONParser.java:63)
at com.example.danilshik.kurs2.FirstActivity$GetProductDetails$1.run(FirstActivity.java:139)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
0
vxg
Модератор
3287 / 2082 / 329
Регистрация: 13.01.2012
Сообщений: 8,105
27.04.2017, 16:45 3
danilshik, NetworkOnMainThreadException - не делайте сетевой запрос в UI потоке - выносите его в отдельный поток
0
danilshik
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
27.04.2017, 17:13  [ТС] 4
если бы вы подсказали как изменить код, а то в основном по примерам делал
0
demixdn
310 / 255 / 79
Регистрация: 31.10.2016
Сообщений: 619
27.04.2017, 17:24 5
сначала вызвать это
Цитата Сообщение от danilshik Посмотреть сообщение
doInBackground
а потом сразу же это
Цитата Сообщение от danilshik Посмотреть сообщение
runOnUiThread
хехе, знатно пошутили

Добавлено через 6 минут
если делать через асинктаски то как то так.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    class GetProductDetails extends AsyncTask<String, String, JSONObject> {
 
        /**
         * Перед началом показать в фоновом потоке прогресс диалог
         **/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(FirstActivity.this);
            pDialog.setMessage("Загрузка информации о пользователе. Пожалуйста, подождите");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
 
        /**
         * Получение детальной информации о продукте в фоновом режиме
         **/
        protected JSONObject doInBackground(String[] params) {
                    // проверяем статус success тега
                    int success;
                    try {
                        // Список параметров
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("user_id", user_id));
 
                        // получаем продукт по HTTP запросу
                        JSONObject json = jsonParser.makeHttpRequest(url_users_details, "GET", params);
 
                        Log.d("Single Product Details", json.toString());
 
                        success = json.getInt(TAG_SUCCESS);
                        if (success == 1) {
                            return json;
                        }else{
                            // продукт с userid не найден
                            return null;
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
        }
 
        /**
         * После завершения фоновой задачи закрываем диалог прогресс
         **/
        protected void onPostExecute(JSONObject json) {
            if(json!=null){}
                Toast toast = Toast.makeText(getApplicationContext(), "Успешно получена информация о продукте",Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
         
                // Успешно получинна детальная информация о продукте
                JSONArray usersObj = json.getJSONArray(TAG_USERS);
         
                // получаем первый обьект с JSON Array
                JSONObject users = usersObj.getJSONObject(0);
         
                // продукт с userid найден
                // Edit Text
                txtName = (EditText) findViewById(R.id.inputName);
                txtLocation = (EditText) findViewById(R.id.inputLocation);
         
         
                // показываем данные о продукте в EditText
                txtName.setText(users.getString(TAG_NAME));
                txtLocation.setText(users.getString(TAG_LOCATION));
            }
            // закрываем диалог прогресс
            pDialog.dismiss();
        }
    }
0
danilshik
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
28.04.2017, 07:33  [ТС] 6
Заменил код класса GetProductDetails, теперь большинство методов и переменных красным подсвечиваются, например pDialog. Может нет видимости?
0
Миниатюры
Ошибка NetworkOnMainThreadException  
ExFau$t
767 / 632 / 158
Регистрация: 08.05.2012
Сообщений: 3,084
28.04.2017, 09:27 7
А навести на ошибку и посмотреть не? Я try-catch не вижу, как минимум.
0
28.04.2017, 09:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2017, 09:27

IIS- asp ошибка: HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP Internet Information Services
Привет! Конфигурация win2000pro sp2, стандартный IIS, IE 5. При попытке обратиться к...

Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи!
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений...

Ошибка при добавлении в файл. Ошибка 101: Ошибка записи на диск (Error 101: Disk write error).
Здравствуйте, возникла проблема такого плана. Нужно произвести добавление записи в файл, но после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru