Правильно ли ставить намерение внутри потока Runnable? - PullRequest
0 голосов
/ 24 мая 2018

В моем приложении я использую библиотеку Room для чтения / записи значений.В одном упражнении я читаю значение из моей базы данных SQLite, и мне нужно передать это значение следующему действию.Просто потому, что мы не можем прочитать значения в основном потоке, я использую другой поток.Когда я попытался поместить эти значения в intent.putExtra вне потока, это дало мне Nullpointerexception.Но если я добавлю свой intent в поток, все будет в порядке.Я хочу знать, нормально ли помещать свои намерения в поток?Это правильный метод?Нужно ли использовать AsyncTask?

    Runnable r = new Runnable(){
        @Override
        public void run() {
            List<Vehicle> list = dDb.vehicleDao().getAll();
            for (Vehicle s : list) {
                vehicleNumber = s.getVehicleNo();
                vehicleDescrp = s.getDescription();
            }

            // Session manager
            session = new SessionManager(getApplicationContext());

            // Check if user is already logged in or not
            if (session.isLoggedIn()) {

                // Launch main activity
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                intent.putExtra("VEHICLEID", vehicleNumber);
                intent.putExtra("VEHICLEDS", vehicleDescrp);
                startActivity(intent);
                finish();

            }
        }
    };

    Thread newThread= new Thread(r);
    newThread.start();

1 Ответ

0 голосов
/ 24 мая 2018

Это не сработает, потому что вы не можете делать такие вещи, как открытие Actvity за пределами Main Thread.

Если вам это действительно нужно, вы должны обернуть его с

runOnUiThread(new Runnable() {
     void run() {
         // Do stuff…
     }
});

Так что в вашем случае это будет выглядеть как

Runnable r = new Runnable(){
    @Override
    public void run() {
        List<Vehicle> list = dDb.vehicleDao().getAll();
        for (Vehicle s : list) {
            vehicleNumber = s.getVehicleNo();
            vehicleDescrp = s.getDescription();
        }

        // Session manager
        session = new SessionManager(getApplicationContext());

        // Check if user is already logged in or not
        if (session.isLoggedIn()) {
           LoginActivity.this.runOnUiThread(new Runnable() {
           void run() {
                // Launch main activity
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                intent.putExtra("VEHICLEID", vehicleNumber);
                intent.putExtra("VEHICLEDS", vehicleDescrp);
                startActivity(intent);
                finish();
        }
    };

Thread newThread= new Thread(r);
newThread.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...