My goal was to send a POST request to my PHP page. I looked through a bunch of sites and materials and made a banal HTTP request after which I have android.os.NetworkOnMainThreadException raised this error. I tried to do it through Asynctask, but I didn’t understand anything and that’s what happened

package ktl.myapplication; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button btnOk; /**Вызывается при первом создании */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // загрузка layout setContentView(R.layout.activity_main); btnOk = (Button) findViewById(R.id.btn1); OnClickListener oclBtnOk = new OnClickListener() { @Override public void onClick(View v) { class RequestTask extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { try { //создаем запрос на сервер DefaultHttpClient hc = new DefaultHttpClient(); ResponseHandler<String> res = new BasicResponseHandler(); //он у нас будет посылать post запрос HttpPost postMethod = new HttpPost("http://shkz3.info/switch.php"); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); nameValuePairs.add(new BasicNameValuePair("PAR", "SVET1")); //собераем их вместе и посылаем на сервер postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs)); } catch (Exception e) { System.out.println("Exp=" + e); } return null; } } } }; btnOk.setOnClickListener(oclBtnOk); } } 

as well as logcat

 04-02 11:23:44.575 32216-32216/ktl.myapplication D/dalvikvm﹕ Zygote::ForkAndSpecialize : 0 04-02 11:23:44.578 32216-32216/ktl.myapplication D/dalvikvm﹕ zygote get new systemTid : 32216 04-02 11:23:44.578 32216-32216/ktl.myapplication D/dalvikvm﹕ Late-enabling CheckJNI 04-02 11:23:44.578 32216-32220/ktl.myapplication D/dalvikvm﹕ threadid=2: interp stack at 0x5ba49000 04-02 11:23:44.578 32216-32220/ktl.myapplication D/dalvikvm﹕ init ref table 04-02 11:23:44.578 32216-32220/ktl.myapplication D/dalvikvm﹕ init mutex 04-02 11:23:44.579 32216-32221/ktl.myapplication D/dalvikvm﹕ threadid=3: interp stack at 0x5bb69000 04-02 11:23:44.579 32216-32221/ktl.myapplication D/dalvikvm﹕ init ref table 04-02 11:23:44.579 32216-32221/ktl.myapplication D/dalvikvm﹕ init mutex 04-02 11:23:44.579 32216-32221/ktl.myapplication D/dalvikvm﹕ Elevating priority from 0 to -8 04-02 11:23:44.579 32216-32216/ktl.myapplication D/jdwp﹕ prepping for JDWP over ADB 04-02 11:23:44.579 32216-32222/ktl.myapplication D/dalvikvm﹕ threadid=4: interp stack at 0x5ecaa000 04-02 11:23:44.579 32216-32222/ktl.myapplication D/dalvikvm﹕ init ref table 04-02 11:23:44.579 32216-32222/ktl.myapplication D/dalvikvm﹕ init mutex 04-02 11:23:44.579 32216-32222/ktl.myapplication D/jdwp﹕ JDWP: thread running 04-02 11:23:44.580 32216-32222/ktl.myapplication D/jdwp﹕ trying to receive file descriptor from ADB 04-02 11:23:44.625 32216-32228/ktl.myapplication D/dalvikvm﹕ threadid=9: interp stack at 0x5f43e000 04-02 11:23:44.625 32216-32228/ktl.myapplication D/dalvikvm﹕ init ref table 04-02 11:23:44.625 32216-32228/ktl.myapplication D/dalvikvm﹕ init mutex 04-02 11:23:44.625 32216-32229/ktl.myapplication D/dalvikvm﹕ threadid=10: interp stack at 0x5f55c000 04-02 11:23:44.625 32216-32229/ktl.myapplication D/dalvikvm﹕ init ref table 04-02 11:23:44.625 32216-32229/ktl.myapplication D/dalvikvm﹕ init mutex 04-02 11:23:44.655 32216-32222/ktl.myapplication D/jdwp﹕ received file descriptor 47 from ADB 04-02 11:23:44.669 32216-32216/ktl.myapplication V/SettingsProviderInterface﹕ invalidate [system]: current 244 != cached 0 04-02 11:23:44.670 32216-32216/ktl.myapplication D/ActivityThread﹕ hoder:android.app.IActivityManager$ContentProviderHolder@43160db0,provider,holder.Provider:android.content.ContentProviderProxy@43161528 04-02 11:23:44.673 32216-32216/ktl.myapplication D/asset﹕ AssetManager-->addDefaultAssets CIP path not exsit! 04-02 11:23:44.676 32216-32216/ktl.myapplication D/Proxy﹕ setHttpRequestCheckHandler 04-02 11:23:44.678 32216-32216/ktl.myapplication D/dalvikvm﹕ open_cached_dex_file : /data/app/ktl.myapplication-2.apk /data/dalvik-cache/data@app@ktl.myapplication-2.apk@classes.dex 04-02 11:23:44.680 32216-32216/ktl.myapplication D/ActivityThread﹕ BIND_APPLICATION handled : 0 / AppBindData{appInfo=ApplicationInfo{4315e3e8 ktl.myapplication}} 04-02 11:23:44.680 32216-32216/ktl.myapplication V/ActivityThread﹕ Handling launch of ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}} 04-02 11:23:44.747 32216-32216/ktl.myapplication V/ActivityThread﹕ ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}}: app=android.app.Application@43165428, appName=ktl.myapplication, pkg=ktl.myapplication, comp={ktl.myapplication/ktl.myapplication.MainActivity}, dir=/data/app/ktl.myapplication-2.apk 04-02 11:23:44.749 32216-32216/ktl.myapplication D/dalvikvm﹕ create interp thread : stack size=128KB 04-02 11:23:44.749 32216-32216/ktl.myapplication D/dalvikvm﹕ create new thread 04-02 11:23:44.749 32216-32216/ktl.myapplication D/dalvikvm﹕ new thread created 04-02 11:23:44.749 32216-32216/ktl.myapplication D/dalvikvm﹕ update thread list 04-02 11:23:44.750 32216-32230/ktl.myapplication D/dalvikvm﹕ threadid=11: interp stack at 0x5f726000 04-02 11:23:44.750 32216-32230/ktl.myapplication D/dalvikvm﹕ init ref table 04-02 11:23:44.750 32216-32230/ktl.myapplication D/dalvikvm﹕ init mutex 04-02 11:23:44.750 32216-32230/ktl.myapplication D/dalvikvm﹕ threadid=11: created from interp 04-02 11:23:44.750 32216-32216/ktl.myapplication D/dalvikvm﹕ start new thread 04-02 11:23:44.750 32216-32230/ktl.myapplication D/dalvikvm﹕ threadid=11: notify debugger 04-02 11:23:44.750 32216-32230/ktl.myapplication D/dalvikvm﹕ threadid=11 (LaunchIconThemeResource): calling run() 04-02 11:23:44.757 32216-32216/ktl.myapplication D/asset﹕ AssetManager-->addDefaultAssets CIP path not exsit! 04-02 11:23:44.800 32216-32216/ktl.myapplication D/jiayh2﹕ LaunchIconThemeResourcegetDrawable packageName:ktl.myapplication asetfile:null 04-02 11:23:44.801 32216-32216/ktl.myapplication D/jiayh2﹕ LaunchIconThemeResourcegetDrawable packageName:ktl.myapplication asetfile:null 04-02 11:23:44.803 32216-32216/ktl.myapplication D/jiayh2﹕ LaunchIconThemeResourcegetDrawable packageName:ktl.myapplication asetfile:null 04-02 11:23:44.806 32216-32216/ktl.myapplication D/jiayh2﹕ LaunchIconThemeResourcegetDrawable packageName:ktl.myapplication asetfile:null 04-02 11:23:44.807 32216-32216/ktl.myapplication D/jiayh2﹕ LaunchIconThemeResourcegetDrawable packageName:ktl.myapplication asetfile:null 04-02 11:23:44.809 32216-32216/ktl.myapplication V/ActivityThread﹕ Performing resume of ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}} finished=false 04-02 11:23:44.809 32216-32216/ktl.myapplication D/ActivityThread﹕ ACT-AM_ON_RESUME_CALLED ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}} 04-02 11:23:44.809 32216-32216/ktl.myapplication V/ActivityThread﹕ Resume ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}} started activity: false, hideForNow: false, finished: false 04-02 11:23:44.854 32216-32216/ktl.myapplication V/PhoneWindow﹕ DecorView setVisiblity: visibility = 4 ,Parent =null, this =com.android.internal.policy.impl.PhoneWindow$DecorView{4316c030 IE.... R.....ID 0,0-0,0} 04-02 11:23:44.968 32216-32216/ktl.myapplication V/ActivityThread﹕ Resuming ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}} with isForward=true 04-02 11:23:44.968 32216-32216/ktl.myapplication V/PhoneWindow﹕ DecorView setVisiblity: visibility = 0 ,Parent =ViewRoot{43179d90 ktl.myapplication/ktl.myapplication.MainActivity,ident = 0}, this =com.android.internal.policy.impl.PhoneWindow$DecorView{4316c030 VE.... R.....ID 0,0-0,0} 04-02 11:23:44.968 32216-32216/ktl.myapplication V/ActivityThread﹕ Scheduling idle handler for ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}} 04-02 11:23:44.969 32216-32216/ktl.myapplication D/ActivityThread﹕ ACT-LAUNCH_ACTIVITY handled : 0 / ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}} 04-02 11:23:44.971 32216-32216/ktl.myapplication D/jiayh2﹕ FontThemeManager createThemeFont typefacetype=2, curfontpath=/system/fonts/DroidSansFallback.ttf 04-02 11:23:44.971 32216-32216/ktl.myapplication D/jiayh2﹕ FontThemeManager createThemeFont typefacetype=2, curfontpath=/system/fonts/DroidSansFallback.ttf 04-02 11:23:44.971 32216-32216/ktl.myapplication D/jiayh2﹕ FontThemeManager createThemeFont typefacetype=2, curfontpath=/system/fonts/DroidSansFallback.ttf 04-02 11:23:45.040 32216-32216/ktl.myapplication D/IMGSRV﹕ mtk_gralloc_debug_check:43: g_gr_dbg=0 v=-1 04-02 11:23:45.040 32216-32216/ktl.myapplication D/IMGSRV﹕ mtk_gralloc_debug_check:43: g_gr_dbg=0 v=-1 04-02 11:23:45.059 32216-32216/ktl.myapplication D/GraphicBuffer﹕ create handle(0x604a6910) (w:1088, h:1920, f:1) 04-02 11:23:45.063 32216-32216/ktl.myapplication D/OpenGLRenderer﹕ Enabling debug mode 0 04-02 11:23:45.064 32216-32216/ktl.myapplication D/GraphicBuffer﹕ create handle(0x60cd26b0) (w:1792, h:1984, f:1) 04-02 11:23:45.071 32216-32216/ktl.myapplication D/OpenGLRenderer﹕ setViewport 1080x1920 <0x604a6a38> 04-02 11:23:45.073 32216-32216/ktl.myapplication V/InputMethodManager﹕ onWindowFocus: null softInputMode=288 first=true flags=#1810100 04-02 11:23:45.073 32216-32216/ktl.myapplication V/InputMethodManager﹕ START INPUT: com.android.internal.policy.impl.PhoneWindow$DecorView{4316c030 VE.... R.....ID 0,0-1080,1920} ic=null tba=android.view.inputmethod.EditorInfo@4318baf8 controlFlags=#104 04-02 11:23:46.466 32216-32216/ktl.myapplication I/View﹕ Touch down dispatch to android.widget.Button{43171f10 VFED..C. ........ 191,48-425,192 #7f08003f app:id/btn1}, event = MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=117.71414, y[0]=76.89589, Xw[0]=16.0, Yw[0]=16.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=56834756, downTime=56834756, deviceId=3, source=0x1002 } 04-02 11:23:46.487 32216-32216/ktl.myapplication D/GraphicBuffer﹕ create handle(0x61bf4b60) (w:1088, h:1920, f:1) 04-02 11:23:46.570 32216-32216/ktl.myapplication I/View﹕ Touch up dispatch to android.widget.Button{43171f10 VFED..C. ...P.... 191,48-425,192 #7f08003f app:id/btn1}, event = MotionEvent { action=ACTION_UP, id[0]=0, x[0]=112.71878, y[0]=74.89693, Xw[0]=32.0, Yw[0]=32.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=56834860, downTime=56834756, deviceId=3, source=0x1002 } 04-02 11:23:46.589 32216-32216/ktl.myapplication D/GraphicBuffer﹕ create handle(0x5f93dc58) (w:1088, h:1920, f:1) 04-02 11:23:48.835 32216-32216/ktl.myapplication I/View﹕ Touch down dispatch to android.widget.Button{43171f10 VFED..C. ........ 191,48-425,192 #7f08003f app:id/btn1}, event = MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=131.7012, y[0]=108.87923, Xw[0]=16.0, Yw[0]=16.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=56837124, downTime=56837124, deviceId=3, source=0x1002 } 04-02 11:23:48.869 32216-32216/ktl.myapplication D/GraphicBuffer﹕ create handle(0x61a99778) (w:1088, h:1920, f:1) 04-02 11:23:49.127 32216-32216/ktl.myapplication I/View﹕ Touch up dispatch to android.widget.Button{43171f10 VFED..C. ...P.... 191,48-425,192 #7f08003f app:id/btn1}, event = MotionEvent { action=ACTION_UP, id[0]=0, x[0]=131.7012, y[0]=108.87923, Xw[0]=32.0, Yw[0]=32.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=56837417, downTime=56837124, deviceId=3, source=0x1002 } 04-02 11:23:49.128 32216-32216/ktl.myapplication V/SettingsProviderInterface﹕ from settings cache , name = sound_effects_enabled , value = 0 04-02 11:24:26.220 32216-32216/ktl.myapplication D/ActivityThread﹕ ACT-AM_ON_PAUSE_CALLED ActivityRecord{4315fbe8 token=android.os.BinderProxy@4315f2d0 {ktl.myapplication/ktl.myapplication.MainActivity}} 04-02 11:24:26.238 32216-32216/ktl.myapplication D/ActivityThread﹕ ACT-PAUSE_ACTIVITY_FINISHING handled : 0 / android.os.BinderProxy@4315f2d0 04-02 11:24:26.335 32216-32216/ktl.myapplication D/OpenGLRenderer﹕ Flushing caches (mode 0) 04-02 11:24:26.349 32216-32216/ktl.myapplication D/GraphicBuffer﹕ close handle(0x604a6910) (w:1088 h:1920 f:1) 04-02 11:24:26.350 32216-32216/ktl.myapplication D/GraphicBuffer﹕ close handle(0x61bf4b60) (w:1088 h:1920 f:1) 04-02 11:24:26.351 32216-32216/ktl.myapplication D/GraphicBuffer﹕ close handle(0x5f93dc58) (w:1088 h:1920 f:1) 04-02 11:24:26.352 32216-32216/ktl.myapplication D/GraphicBuffer﹕ close handle(0x61a99778) (w:1088 h:1920 f:1) 04-02 11:24:26.714 32216-32216/ktl.myapplication D/OpenGLRenderer﹕ Flushing caches (mode 1) 04-02 11:24:26.715 32216-32216/ktl.myapplication D/OpenGLRenderer﹕ Flushing caches (mode 0) 04-02 11:24:26.720 32216-32216/ktl.myapplication D/ActivityThread﹕ ACT-DESTROY_ACTIVITY handled : 1 / android.os.BinderProxy@4315f2d0 
  • Your logcat does not contain any errors, therefore it makes no sense. You do not call hc.execute () and, accordingly, you do not get any result. What exactly are your problems? - Yura Ivanov
  • When you press the button, nothing happens. and the value does not change on the site. I understand it should be called as HttpResponse response = hc.execute (postMethod); Log.d ("Http Post Response:", response.toString ()); - Galizhan Tolybaev 1:58 pm

5 answers 5

NetworkOnMainThreadException - means that you are trying to connect to the server from the main (UI) stream.

It is accepted to "sit down" the connection and generally work with the network on an auxiliary stream ( Thread ) or by means of the melee creation of Runnable/Thread or, what is more kosher through AsyncTask

  • Well, I tried to do it through AsyncTask this code you can see on the page - Galizhan Tolybaev
  • one
    Your AsyncTask not starting - no execution execute() - Barmaley

Google + Under what we program? (Android) + What do we want to do? (Http post) + Something special? (AsyncTask) = Google -> Android httppost asynctask

Further in the most brazen way we open the first link , and we receive the answer! (At the same time, we save our time, my time, my nerves and my nerves, avoid irony and sarcasm about their laziness, etc. Some advantages!)

  • I tried to search, but I didn’t really understand how it all works - Galizhan Tolybaev
  • @GalizhanTolybaev, it's not enough to describe a class that inherits from AsyncTask, you need to create an instance of it, and call a method. But since you do not know this, then your knowledge of Java is too little to engage in Android development. Take the initial courses on Java and Android, and then start programming. Such questions will immediately disappear, which you will have thousands of without these courses. In sum, the time spent on these issues will be much more time spent on mastering the courses. - Vladyslav Matviienko

To add parameters:

 RequestParams params = new RequestParams(); params.put("param1_key", "param1_value"); params.put("param2_key", "param2_value"); 

To work with cookies:

 PersistentCookieStore myCookieStore = new PersistentCookieStore(getApplicationContext()); 

As a result, we get:

 private void onServerPostQuery(){ AsyncHttpClient mClient = new AsyncHttpClient(); PersistentCookieStore mCookieStore = new PersistentCookieStore(getApplicationContext()); mClient.setCookieStore(mCookieStore); mClient.setConnectTimeout(1000 * 10); // Установка таймаута соединения mClient.setResponseTimeout(1000 * 10); // Установка таймаута ожидания ответа String url = "Ваш URL"; RequestParams params = new RequestParams(); params.put("param1_key", param1_val); params.put("param2_key", param2_val); params.put("param3_key", param3_val); mClient.post(url, params, new AsyncHttpResponseHandler() { private String response; private int status; @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { response = new String(responseBody); status = statusCode; } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { response = error.toString(); status = statusCode; } @Override public void onFinish(){ switch(status){ case 200: // Сообщение от сервера получено // Обрабатываем полученное сообщение // Если есть ошибка в скриптах сервера, то она будет получена здесь break; default: // Ошибка internet break; } } }); } 

    In fact, when using http://loopj.com/android-async-http, everything is simple:

     AsyncHttpClient client = new AsyncHttpClient(); String url = "http://www.google.com" // Ваш URL // Выполнение запроса client.post(url, new AsyncHttpResponseHandler() { String response; @Override public void onSuccess(int statusCode, Header[] headers, byte[] response) { // Выполняется при удачном запросе response = new String(response); } @Override public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { // Выполнится при неудачном запросе response = error.toString(); } @Override public void onFinish() { // Выполнится в любом случае при завершении процесса // Здесь можно обрабатывать ответ } 

    });

    • if it's not difficult for you to tell where to write the parameters and why it cannot recognize error - Galizhan Tolybaev

    Try, it can help. Works on both HTTPS and HTTP

     //============================================================================= String query = "https://site.com/api/v1/send_data"; String json = "{\"volume_system\":"+volume_system+ ",\"volume_music\":"+volume_music+ ",\"device_id\":"+device_id+ ",\"bluetooth_isEnabled\":"+'"'+bluetooth_isEnabled+'"'+"}"; URL url = new URL(query); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); OutputStream os = conn.getOutputStream(); os.write(json.getBytes("UTF-8")); os.close(); // read the response InputStream in = new BufferedInputStream(conn.getInputStream()); String inputStreamString = new Scanner(in,"UTF-8").useDelimiter("\\A").next(); System.out.println(inputStreamString); in.close(); conn.disconnect();