AsyncTask не возвращает результат достаточно быстро в основной поток - PullRequest
0 голосов
/ 01 июня 2018

У меня есть asynctask, который получает userPin из моей базы данных Oracle.В моей главной теме, затем на кнопке я запускаю asynctask.Значение из базы данных присваивается переменной с именем userPinRetrieved.

Когда я отлаживаю эту переменную, она получает правильное значение.Однако, когда я обычно запускаю приложение, оно получает нулевое значение.После некоторого исследования и использования Thread.Sleep(x) я вижу, что это связано с тем, что асинхронная задача не возвращает результат главному потоку и переменной во времени.

Мне посоветовали не использовать Thread.Sleep(x), какие у меня есть альтернативы?

Вот мой код:

AsyncTask:

            String line;
                BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));
                while ((line=br.readLine()) != null) {
                    JSONObject json = new JSONObject(line);
                    Log.d("Line",line);
                    if (json.getString("userPin") == null){
                        userPinRetrieved = "PIN NOT RECEIVED";
                        Log.d("userpin", userPinRetrieved);
                    } else {
                        userPinRetrieved = json.getString("userPin");
                        Log.d("userpin", userPinRetrieved);
                    }
                }
            }

        } catch (Exception e) {
            Log.v("ErrorAPP", e.toString());
        }
        return "";
    }

    @Override
    protected void onPostExecute(String userPinRetrieved) {
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
    }
}

Кнопка входа в систему:

 signIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            AsyncTaskRunner postReq = new AsyncTaskRunner();
            postReq.execute("start");
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


            Toast.makeText(UserLogin.this, userPinRetrieved + " " + userPin, Toast.LENGTH_LONG).show();        

            if (userPin.equals(userPinRetrieved)) {
                Toast.makeText(UserLogin.this, "Access Granted!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
                Toast.makeText(UserLogin.this, "Hello " + employee, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(UserLogin.this, "Access Denied! Incorrect Pin", Toast.LENGTH_SHORT).show();
            }
        }
    });

Кто-нибудь может предложить предложения?

Спасибо

1 Ответ

0 голосов
/ 01 июня 2018

Смысл AsyncTask в том, чтобы переместить обработку в другой поток, потому что вы не знаете, сколько времени потребуется для выполнения определенной задачи.Вы можете обработать результат асинхронной задачи в методе onPostExecute.

Итак, переместим использование результата туда:

 @Override
    protected void onPostExecute(String userPinRetrieved) {
       if (userPin.equals(userPinRetrieved)) {
                Toast.makeText(UserLogin.this, "Access Granted!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
                Toast.makeText(UserLogin.this, "Hello " + employee, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(UserLogin.this, "Access Denied! Incorrect Pin", Toast.LENGTH_SHORT).show();
            }
    }

Вы также можете определить метод, который будет вызываться после завершения обработки:

protected void onPostExecute(String userPinRetrieved) {
       processValue(userPinRetrieved);
    }

При обращении к переменным из вашей деятельности в AsyncTask необходимо соблюдать осторожность, если действие уничтожается во время обработки вашей AsyncTask, это может привести к утечке памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...