将intent置于Runnable线程中是否正确?

时间:2018-05-24 12:14:50

标签: android multithreading runnable

在我的应用程序中,我使用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 :(得分:0)

这是行不通的,因为你无法在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();