53

I am developing my first Android app and had built in mostly based on research. When I try to login my user I get the android.os.NetworkOnMainThreadException error. I have read online that Async should be used to make sure that this error doesn't occur but I have no idea how to do that.

Below is all my code.

My User Login Form Activity:

import java.util.HashMap;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.finecalc.library.DatabaseHandler;
import com.finecalc.library.UserFunctions;
 

public class UserLogin extends Activity {
   Button userlogin;
   Button back;
   Button login;
   EditText inputEmail;
   EditText inputPassword;
   TextView loginErrorMsg;
 
    // JSON Response node names
    private static String KEY_SUCCESS = "success";
    private static String KEY_ERROR = "error";
    private static String KEY_ERROR_MSG = "error_msg";
    private static String KEY_UID = "uid";
    private static String KEY_NAME = "name";
    private static String KEY_EMAIL = "email";
    private static String KEY_CREATED_AT = "created_at";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_login);
 
        // Importing all assets like buttons, text fields
        inputEmail = (EditText) findViewById(R.id.inputemail);
        inputPassword = (EditText) findViewById(R.id.inputpassword);
        login = (Button) findViewById(R.id.login);
        //Button register = (Button) findViewById(R.id.register);
        back =(Button)findViewById(R.id.back);
        
        loginErrorMsg = (TextView) findViewById(R.id.login_error);
 
        // Login button Click Event
        login.setOnClickListener(new View.OnClickListener() {
 
            public void onClick(View view) {
                String email = inputEmail.getText().toString();
                String password = inputPassword.getText().toString();
                UserFunctions userFunction = new UserFunctions();
                JSONObject json = userFunction.loginUser(email, password);
 
                // check for login response
                try {
                    //if (json.getString(KEY_SUCCESS) != null) {
                    if(json != null && !(json).isNull(KEY_SUCCESS)){
                        loginErrorMsg.setText("");
                        String res = json.getString(KEY_SUCCESS);
                        if(Integer.parseInt(res) == 1){
                            // user successfully logged in
                            // Store user details in SQLite Database
                            DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                            JSONObject json_user = json.getJSONObject("user");
                             
                            // Clear all previous data in database
                            userFunction.logoutUser(getApplicationContext());
                            db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));                       
                             
                            // Launch Dashboard Screen
                            Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class);
                             
                            // Close all views before launching Dashboard
                            dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(dashboard);
                             
                            // Close Login Screen
                            finish();
                            
                        }else{
                            // Error in login
                            loginErrorMsg.setText("Incorrect username/password");
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

DatabaseHandler

import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 
public class DatabaseHandler extends SQLiteOpenHelper {
 
    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;
 
    // Database Name
    private static final String DATABASE_NAME = "androidlta_api";
 
    // Login table name
    private static final String TABLE_LOGIN = "login";
 
    // Login Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_EMAIL = "email";
    private static final String KEY_UID = "uid";
    private static final String KEY_CREATED_AT = "created_at";
 
    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
 
    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
                + KEY_ID + " INTEGER PRIMARY KEY,"
                + KEY_NAME + " TEXT,"
                + KEY_EMAIL + " TEXT UNIQUE,"
                + KEY_UID + " TEXT,"
                + KEY_CREATED_AT + " TEXT" + ")";
        db.execSQL(CREATE_LOGIN_TABLE);
    }
 
    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);
 
        // Create tables again
        onCreate(db);
    }
 
    /**
     * Storing user details in database
     * */
    public void addUser(String name, String email, String uid, String created_at) {
        SQLiteDatabase db = this.getWritableDatabase();
 
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, name); // Name
        values.put(KEY_EMAIL, email); // Email
        values.put(KEY_UID, uid); // Email
        values.put(KEY_CREATED_AT, created_at); // Created At
 
        // Inserting Row
        db.insert(TABLE_LOGIN, null, values);
        db.close(); // Closing database connection
    }
     
    /**
     * Getting user data from database
     * */
    public HashMap<String, String> getUserDetails(){
        HashMap<String,String> user = new HashMap<String,String>();
        String selectQuery = "SELECT  * FROM " + TABLE_LOGIN;
          
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
            user.put("name", cursor.getString(1));
            user.put("email", cursor.getString(2));
            user.put("uid", cursor.getString(3));
            user.put("created_at", cursor.getString(4));
        }
        cursor.close();
        db.close();
        // return user
        return user;
    }
 
    /**
     * Getting user login status
     * return true if rows are there in table
     * */
    public int getRowCount() {
        String countQuery = "SELECT  * FROM " + TABLE_LOGIN;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        int rowCount = cursor.getCount();
        db.close();
        cursor.close();
         
        // return row count
        return rowCount;
    }
     
    /**
     * Re crate database
     * Delete all tables and create them again
     * */
    public void resetTables(){
        SQLiteDatabase db = this.getWritableDatabase();
        // Delete All Rows
        db.delete(TABLE_LOGIN, null, null);
        db.close();
    }
}

UserFunctions

import java.util.ArrayList;
import java.util.List;
 
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;
 
import android.content.Context;
import android.util.Log;
 
public class UserFunctions {
     
    private JSONParser jsonParser;
     
    // Testing in localhost using LAMP
   
    private static String loginURL = "http://127.0.0.1/android_api/index.php";
    private static String registerURL = "http://127.0.0.1/android_api/index.php";
     
    private static String login_tag = "login";
    private static String register_tag = "register";
     
    // constructor
    public UserFunctions(){
        jsonParser = new JSONParser();
    }
     
    /**
     * function make Login Request
     * @param email
     * @param password
     * */
    public JSONObject loginUser(String email, String password){
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag", login_tag));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("password", password));
        JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
        // return json
        // Log.e("JSON", json.toString());
        return json;
    }
     
    /**
     * function make Login Request
     * @param name
     * @param email
     * @param password
     * */
    public JSONObject registerUser(String name, String licencenumber, String email, String password){
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag", register_tag));
        params.add(new BasicNameValuePair("name", name));
        params.add(new BasicNameValuePair("licencenumber",licencenumber));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("password", password));
         
        // getting JSON Object
        JSONObject json = jsonParser.getJSONFromUrl(registerURL, params);
        // return json
        return json;
    }
     
    /**
     * Function get Login status
     * */
    public boolean isUserLoggedIn(Context context){
        DatabaseHandler db = new DatabaseHandler(context);
        int count = db.getRowCount();
        if(count > 0){
            // user logged in
            return true;
        }
        return false;
    }
     
    /**
     * Function to logout user
     * Reset Database
     * */
    public boolean logoutUser(Context context){
        DatabaseHandler db = new DatabaseHandler(context);
        db.resetTables();
        return true;
    }
     
}

JSONParser

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
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.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
 
import android.util.Log;
 
public class JSONParser {
 
  static InputStream is = null;
  static JSONObject jObj = null;
  static String json = "";
 
  // constructor
  public JSONParser() {
 
  }
 
  public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {
 
        // Making HTTP request
        try {
            // 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();
 
        } 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();
           // Log.e("JSON", json);
        } 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;
 
    }
}

My AndroidManifest also includes:
<uses-permission android:name="android.permission.INTERNET" />.

Below is my error:

    08-02 04:39:23.410: D/(2642): HostConnection::get() New Host Connection established 0xb97a3b90, tid 2642
    08-02 04:39:23.480: W/EGL_emulation(2642): eglSurfaceAttrib not implemented
    08-02 04:39:23.480: D/OpenGLRenderer(2642): Enabling debug mode 0
    08-02 04:39:29.150: W/EGL_emulation(2642): eglSurfaceAttrib not implemented
    08-02 04:39:33.650: D/InputEventConsistencyVerifier(2642): KeyEvent: ACTION_UP but key was not down.
    08-02 04:39:33.650: D/InputEventConsistencyVerifier(2642):   in android.widget.EditText{b1fa92d8 VFED..CL .F...... 0,82-240,118 #7f07001c app:id/inputpassword}
    08-02 04:39:33.650: D/InputEventConsistencyVerifier(2642):   0: sent at 7133734000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_TAB, scanCode=15, metaState=0, flags=0x8, repeatCount=0, eventTime=7133734, downTime=7133655, deviceId=0, source=0x101 }
    08-02 04:39:38.231: D/dalvikvm(2642): GC_FOR_ALLOC freed 177K, 8% free 2964K/3192K, paused 21ms, total 24ms
    08-02 04:39:38.321: D/AndroidRuntime(2642): Shutting down VM
    08-02 04:39:38.321: W/dalvikvm(2642): threadid=1: thread exiting with uncaught exception (group=0xb1cd3b20)
    08-02 04:39:38.331: E/AndroidRuntime(2642): FATAL EXCEPTION: main
    08-02 04:39:38.331: E/AndroidRuntime(2642): Process: com.finecalc.ltafinecalculator, PID: 2642
    08-02 04:39:38.331: E/AndroidRuntime(2642): android.os.NetworkOnMainThreadException
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at libcore.io.IoBridge.connect(IoBridge.java:112)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.net.Socket.connect(Socket.java:843)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.finecalc.library.JSONParser.getJSONFromUrl(JSONParser.java:41)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.finecalc.library.UserFunctions.loginUser(UserFunctions.java:42)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.finecalc.ltafinecalculator.UserLogin$1.onClick(UserLogin.java:57)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.view.View.performClick(View.java:4438)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.view.View$PerformClick.run(View.java:18422)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.os.Handler.handleCallback(Handler.java:733)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.os.Handler.dispatchMessage(Handler.java:95)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.os.Looper.loop(Looper.java:136)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at android.app.ActivityThread.main(ActivityThread.java:5017)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.lang.reflect.Method.invokeNative(Native Method)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at java.lang.reflect.Method.invoke(Method.java:515)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    08-02 04:39:38.331: E/AndroidRuntime(2642):     at dalvik.system.NativeStart.main(Native Method)
    08-02 04:39:41.111: D/(2670): HostConnection::get() New Host Connection established 0xb97a3cc0, tid 2670
    08-02 04:39:41.181: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
    08-02 04:39:41.181: D/OpenGLRenderer(2670): Enabling debug mode 0
    08-02 04:39:45.771: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
    08-02 04:39:48.371: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
    08-02 04:39:50.971: D/dalvikvm(2670): GC_FOR_ALLOC freed 123K, 6% free 3018K/3192K, paused 28ms, total 32ms
    08-02 04:39:51.581: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
    08-02 04:39:51.811: D/dalvikvm(2670): GC_FOR_ALLOC freed 152K, 6% free 3380K/3584K, paused 22ms, total 31ms
    08-02 04:40:18.351: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
    08-02 04:40:21.741: W/EGL_emulation(2670): eglSurfaceAttrib not implemented
    08-02 04:40:23.021: D/AndroidRuntime(2670): Shutting down VM
    08-02 04:40:23.021: W/dalvikvm(2670): threadid=1: thread exiting with uncaught exception (group=0xb1cd3b20)
    08-02 04:40:23.031: E/AndroidRuntime(2670): FATAL EXCEPTION: main
    08-02 04:40:23.031: E/AndroidRuntime(2670): Process: com.finecalc.ltafinecalculator, PID: 2670
    08-02 04:40:23.031: E/AndroidRuntime(2670): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.finecalc.ltafinecalculator/com.finecalc.ltafinecalculator.UserRegister}: java.lang.NullPointerException
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.os.Handler.dispatchMessage(Handler.java:102)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.os.Looper.loop(Looper.java:136)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.main(ActivityThread.java:5017)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at java.lang.reflect.Method.invokeNative(Native Method)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at java.lang.reflect.Method.invoke(Method.java:515)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at dalvik.system.NativeStart.main(Native Method)
    08-02 04:40:23.031: E/AndroidRuntime(2670): Caused by: java.lang.NullPointerException
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at com.finecalc.ltafinecalculator.UserRegister.onCreate(UserRegister.java:26)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.Activity.performCreate(Activity.java:5231)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
    08-02 04:40:23.031: E/AndroidRuntime(2670):     ... 11 more
kabr8
  • 341
  • 1
  • 2
  • 19
Jason6916
  • 631
  • 1
  • 5
  • 8
  • Possible duplicate of [Android http connection exception](http://stackoverflow.com/questions/6976317/android-http-connection-exception) – Amir Ali Akbari Jan 31 '16 at 15:17

4 Answers4

112

This exception is thrown when application attempts to perform a networking operation in the main thread. Use below code in your onViewCreated to avoid this error else Call your networking operations (getting data from web server) request in thread or Asynch class.

public void onViewCreated(View view, Bundle savedInstanceState) 
{
    int SDK_INT = android.os.Build.VERSION.SDK_INT;
    if (SDK_INT > 8) 
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
        //your codes here

    }
}
Stefano Mtangoo
  • 6,017
  • 6
  • 47
  • 93
APriya
  • 1,994
  • 1
  • 16
  • 21
  • thank you very much. That has gotten rid of the error but noa iam left with only one error which is: Value Table of type java.lang.String cannot be converted to JSONObject – Jason6916 Aug 02 '14 at 18:47
  • 1
    The above code actually sorted it out but now i have another error and this one is killing me for the whole day. You have no idea how grateful i would be if you could assist on this one. http://stackoverflow.com/questions/25116623/e-json-parser1506-error-parsing-data-end-of-input-at-character-0-of?noredirect=1#comment39089381_25116623 – Jason6916 Aug 04 '14 at 11:38
  • Thnx. I just dont know where I am stuck on it and only that one line of error pops up on log cat – Jason6916 Aug 04 '14 at 11:51
  • looks like your PHP file returning invalid response ,debug your php side whether the return json value is well formed structure – APriya Aug 04 '14 at 12:02
  • Making the call in a separate thread did the trick for me :-) – Saqib R. Jan 14 '16 at 12:31
  • Same thing in Kotlin: if (Build.VERSION.SDK_INT > 9) { val policy = StrictMode.ThreadPolicy.Builder().permitAll().build() StrictMode.setThreadPolicy(policy) } – Stefan Horning Feb 22 '20 at 17:45
47

Try to add this code:

Add this code below the line in you user login activity

         setContentView(R.layout.user_login);
        if (android.os.Build.VERSION.SDK_INT > 9)
        {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

Hope this may help you!

Krupa Patel
  • 3,309
  • 3
  • 23
  • 28
5

Below code used in Kotlin,

minSdkVersion 14

If your minSdkVersion less than 21 from app-level build.gradle then used below one

if (Build.VERSION.SDK_INT > 9) {
      val policy = ThreadPolicy.Builder().permitAll().build()
      StrictMode.setThreadPolicy(policy)
}

minSdkVersion 21

If your minSdkVersion 21 or above from app-level build.gradle then used below one

val policy = ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
Pratik Dodiya
  • 2,337
  • 1
  • 19
  • 12
2

use AsyncTask to run long running api call to different thread.

Example Code

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;

public class AsyncExample extends Activity{


private String url="http://www.google.co.in";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    apiCall();
}


private void apiCall() {

    new AsyncCaller().execute();

}

private class AsyncCaller extends AsyncTask<Void, Void, Void>
{
    ProgressDialog pdLoading = new ProgressDialog(AsyncExample.this);

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        //this method will be running on UI thread
        pdLoading.setMessage("\tLoading...");
        pdLoading.show();
    }
    @Override
    protected Void doInBackground(Void... params) {

        //this method will be running on background thread so don't update UI frome here
        //do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here


        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        //this method will be running on UI thread

        pdLoading.dismiss();
    }

    }
}
Abhishek Garg
  • 3,092
  • 26
  • 30