Использование AsyncTask

Извините, если это простой вопрос, но я очень новичок в этом и все еще изучаю.

У меня есть приложение, и когда мои пользователи нажимают кнопку для входа в систему после ввода их данных, это сбой с помощью android.os.NetworkOnMainThreadException Я обнаружил, что это потому, что я выполняю сетевую операцию в основном потоке и, чтобы решить, мне нужно использовать AsyncTask, я придерживаюсь, однако, синтаксиса.

Вот мой код после нажатия кнопки, вызывает функцию для подключения, а затем анализирует json в 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();
            }
        }
    });

Как мне изменить это на правильный класс? Я не передаю URL и т.д. Я думаю, что это должно быть что-то вроде этого, но я действительно пытаюсь получить синтаксис правильно.

Большое спасибо!!!

class login extends AsyncTask<Void, Void, Void> {

    private Exception exception;

    protected ??? doInBackground(???) {
        try {

Ответы

Ответ 1

Это будет что-то вроде этого

   public class TalkToServer extends AsyncTask<Void, Void, Void> {

   @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...
        */
   }
}

Затем вы можете выполнить его с помощью

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

Вам может не понадобиться onProgressUpdate() или onPreExecute(), если вы не используете их для показа Dialog, прогресса или других задач до или после doInBackground().

onPreExecute() может использоваться для инициализации и отображения ProgressDialog. Тогда он может быть отклонен в onPostExecute()

После завершения задачи

onPostExecute(). Если класс является внутренним классом вашего Activity, тогда вы можете обновить там теги UI или вызвать функцию для запуска кода после завершения задачи. Если это отдельный файл, чем Activity, вы можете использовать interface и создать callBack в Activity и запустить код там, как только закончится выполнение задачи.

В этом ответе говорится об использовании интерфейса для обратного вызова, если вам нужно

Убедитесь, что обновление UI выполняется любым способом кроме doInBackground() или отправлено обратно в Activity в любую функцию, кроме doInBackground(). Тяжелый подъем, такой как сетевые операции, должен выполняться в doInBackground().

Кроме того, обязательно прочитайте