Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将意图放在可运行线程中是否正确?_Android_Multithreading_Runnable - Fatal编程技术网

Android 将意图放在可运行线程中是否正确?

Android 将意图放在可运行线程中是否正确?,android,multithreading,runnable,Android,Multithreading,Runnable,在我的应用程序中,我使用房间库读取/写入值。在一个活动中,我正在从SQLite db读取一个值,我需要将该值传递给下一个活动。因为我们无法读取主线程中的值,所以我使用的是另一个线程。当我试图将这些值放到intent.putExtra线程之外时,它会给我Nullpointerexception。但是如果我把我的意图放在线程中,一切似乎都正常。我想知道是否可以把我的意图放在线程中?这是正确的方法吗?我需要使用AsyncTask吗 Runnable r = new Runnable(){

在我的应用程序中,我使用房间库读取/写入值。在一个活动中,我正在从SQLite db读取一个值,我需要将该值传递给下一个活动。因为我们无法读取主线程中的值,所以我使用的是另一个线程。当我试图将这些值放到
intent.putExtra
线程之外时,它会给我
Nullpointerexception
。但是如果我把我的
意图
放在线程中,一切似乎都正常。我想知道是否可以把我的意图放在线程中?这是正确的方法吗?我需要使用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();
Runnable r=newrunnable(){
@凌驾
公开募捐{
List List=dDb.vehicleDao().getAll();
用于(车辆编号:列表){
vehicleNumber=s.getVehicleNo();
vehicleDescrp=s.getDescription();
}
//会话管理器
session=newsessionmanager(getApplicationContext());
//检查用户是否已登录
if(session.isLoggedIn()){
//开展主要活动
意向意向=新意向(LoginActivity.this、MainActivity.class);
意向书。putExtra(“车辆ID”,车辆编号);
意向。额外(“车辆指示灯”,车辆指示灯);
星触觉(意向);
完成();
}
}
};
螺纹newThread=新螺纹(r);
newThread.start();

这将不起作用,因为您无法在
主线程之外执行类似于打开
活动的操作

如果你真的需要它,你必须用

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();
Runnable r=newrunnable(){
@凌驾
公开募捐{
List List=dDb.vehicleDao().getAll();
用于(车辆编号:列表){
vehicleNumber=s.getVehicleNo();
vehicleDescrp=s.getDescription();
}
//会话管理器
session=newsessionmanager(getApplicationContext());
//检查用户是否已登录
if(session.isLoggedIn()){
LoginActivity.this.runOnUiThread(新的Runnable()文件){
无效运行(){
//开展主要活动
意向意向=新意向(LoginActivity.this、MainActivity.class);
意向书。putExtra(“车辆ID”,车辆编号);
意向。额外(“车辆指示灯”,车辆指示灯);
星触觉(意向);
完成();
}
};
螺纹newThread=新螺纹(r);
newThread.start();

这将不起作用,因为您无法在
主线程之外执行类似于打开
活动的操作

如果你真的需要它,你必须用

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();
Runnable r=newrunnable(){
@凌驾
公开募捐{
List List=dDb.vehicleDao().getAll();
用于(车辆编号:列表){
vehicleNumber=s.getVehicleNo();
vehicleDescrp=s.getDescription();
}
//会话管理器
session=newsessionmanager(getApplicationContext());
//检查用户是否已登录
if(session.isLoggedIn()){
LoginActivity.this.runOnUiThread(新的Runnable()文件){
无效运行(){
//开展主要活动
意向意向=新意向(LoginActivity.this、MainActivity.class);
意向书。putExtra(“车辆ID”,车辆编号);
意向。额外(“车辆指示灯”,车辆指示灯);
星触觉(意向);
完成();
}
};
螺纹newThread=新螺纹(r);
newThread.start();

相反,利用AsyncTask,它非常适合该作业。在doInBackground(…){//Run in background}中运行您的算法,并在onPostExecute(…){//Run on main thread}中构建您的意图好的,我试试。谢谢you@JoeyDaluAsyncTask对简单线程没有太大的优势。毕竟AsyncTask只是线程的包装器。最好使用RxJava或协同路由。@DEADMC true,但AsyncTask建议用于短时间运行的任务,并增加了简单性利用AsyncTask,它非常适合于此工作。运行algdoInBackground(…){//run in background}中的算法,并在它的onPostExecute(…){//run on main thread}中构建您的意图好的,我试试。谢谢you@JoeyDaluAsyncTask与简单线程相比没有太大的优势。毕竟AsyncTask只是线程的包装器。最好使用RxJava或协同路由。@DEADMC true,但AsyncTask建议用于短时间运行的任务,并增加了简单性