android.os.NetworkOnMainThreadException при публикации данных в URL
В приведенном ниже коде я получаю сообщение об ошибке при запуске моего проекта Android
Код:
try {
Gson gson = new Gson();
String json = gson.toJson(stockDetailData);
String json1 = gson.toJson(stockMainData);
String json2 = gson.toJson(pledgerData);
JSONObject jo = new JSONObject();
jo.put("stockDetailData", json.toString());
jo.put("stockMainData", json1.toString());
jo.put("pledgerData", json2.toString());
jo.put("company_id", "4");
URL url = new URL("http://127.0.0.1:180/AfaqTraders/index.php/sale/saveVoucher");
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url.toURI());
// Prepare JSON to send by setting the entity
httpPost.setEntity(new StringEntity(jo.toString(), "UTF-8"));
// Set up the header types needed to properly transfer JSON
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader("Accept-Encoding", "application/json");
httpPost.setHeader("Accept-Language", "en-US");
// Execute POST
HttpResponse response = httpClient.execute(httpPost);
} catch(Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
Ошибка: android.os.NetworkOnMainThreadException
Я искал ошибку, но не могу ее найти. Кто-нибудь может сказать мне, что я здесь делаю неправильно?
4 ответа
Это потому, что вы делаете сетевую операцию на Main UI thread
если вы используете потоки для сетевых операций, вы можете использовать этот фрагмент кода
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy =
new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
в вашем OnCreate()
Но неправильно использовать вышеуказанную операцию, вместо этого следует использовать AsyncTask
класс, предоставляемый Android для правильной работы сети without blocking UI thread
,
Вы можете узнать больше, посетив эту ссылку
или можете использовать приведенный ниже код
private class UploadFiles extends AsyncTask<String, Void, Void> {
protected String doInBackground(String... urls) {
//THIS METHOD WILL BE CALLED AFTER ONPREEXECUTE
//YOUR NETWORK OPERATION HERE
return null;
}
protected void onPreExecute() {
super.onPreExecute();
//THIS METHOD WILL BE CALLED FIRST
//DO OPERATION LIKE SHOWING PROGRESS DIALOG PRIOR TO BEGIN NETWORK OPERATION
}
protected void onPostExecute(String result) {
super.onPostExecute();
//TNIS METHOD WILL BE CALLED AT LAST AFTER DOINBACKGROUND
//DO OPERATION LIKE UPDATING UI HERE
}
}
и вы можете просто позвонить в этот класс, написав
new UploadFiles ().execute(new String[]{//YOUR LINK});
Вы должны подключиться к сети, используя Asynctask, потоки, обработчик, а не основной поток. Если вы попытаетесь подключиться (выполнить длительные операции), используя основной UIThread, вы увидите эту ошибку.
you should use asynctask [asynctask][1]
[1]: http://developer.android.com/reference/android/os/AsyncTask.html
> class async extends AsyncTask<Params, Progress, Result>
//Params used in the asynctask
//Progress for progress bar
//Result here the result of parsing
{@Override
protected void onPreExecute() {
//before parsing you can launch a progress bar
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
//processing after parsing
super.onPostExecute(result);
}
@Override
protected Void doInBackground(Void... params) {
// parsing here
return null;
}}
Это исключение выдается, когда приложение пытается выполнить сетевую операцию в своем основном потоке. Запустите ваш код в AsyncTask или IntentService w
см. этот пример, чтобы узнать, как обрабатывать сетевые операции в asyncTask