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