Usando AsyncTask

Disculpas si esta es una pregunta simple, pero soy muy nuevo en esto y sigo aprendiendo.

Tengo una aplicación y cuando mis usuarios hacen clic en el botón para iniciar sesión después de ingresar sus detalles, se está bloqueando con android.os.NetworkOnMainThreadException He descubierto que esto se debe a que estoy realizando una operación de red en el hilo principal y para resolverlo necesito usar AsyncTask, sin embargo estoy atascado con la syntax.

Aquí está mi código después de hacer clic en el botón, llama a una función para conectarse y luego analiza json en sqlite db.

// Login button Click Event btnLogin.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) { 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(); } } }); 

¿Cómo cambio esto a la clase correcta? No estoy pasando URL, etc. Creo que tiene que ser algo como esto, pero realmente estoy luchando por obtener la syntax correcta.

¡¡¡Muchas gracias!!!

 class login extends AsyncTask { private Exception exception; protected ??? doInBackground(???) { try { 

Sería algo como esto

  public class TalkToServer extends AsyncTask { @Override protected void onPreExecute() { /* * do things before doInBackground() code runs * such as preparing and showing a Dialog or ProgressBar */ } @Override protected void onProgressUpdate(Void... values) { /* * updating data * such a Dialog or ProgressBar */ } @Override protected Void doInBackground(Void... params) { //do your work here return null; } @Override protected void onPostExecute(Void result) { /* * do something with data here * display it or send to mainactivity * close any dialogs/ProgressBars/etc... */ } } 

Entonces puedes ejecutarlo con

 TalkToServer myTask = new MyTask(); // can add params for a constructor if needed myTask.execute(); // here is where you would pass data to doInBackground() 

Puede que no necesite onProgressUpdate() o onPreExecute() si no los está usando para mostrar un Dialog , progreso u otras tareas antes o durante doInBackground() .

onPreExecute () se puede usar para inicializar y mostrar un ProgressDialog . Entonces podría descartarse en onPostExecute()

Después de una tarea termina

onPostExecute() se llamará. Si la clase es una clase interna de su Activity , puede actualizar los elementos de la UI allí o llamar a una función para ejecutar el código una vez que la tarea finaliza. Si se trata de un archivo separado de la Activity entonces puede usar una interface y crear una callBack de callBack a la Activity y ejecutar el código una vez que la tarea finalice.

Esta respuesta habla sobre el uso de una interfaz para una callback si necesita

Asegúrese de que cualquier actualización de UI se realice en cualquier método además de doInBackground() o se envíe de vuelta a la Activity en cualquier función además de doInBackground() . El levantamiento de pesas como las operaciones de red se debe hacer en doInBackground() .

Además, asegúrese de leer los documentos AsyncTask por completo. Especialmente las reglas de Threading