Java 如何在所有线程完成执行后返回值
我想买大号的 来自SQLite数据库的xml格式数据,之前我在 UI线程bt我得到了ANR,它花费了很多时间 提取数据,所以我尝试了这段代码,这段代码运行良好 但仍然给我一个对话 请建议更好的方法Java 如何在所有线程完成执行后返回值,java,android,multithreading,Java,Android,Multithreading,我想买大号的 来自SQLite数据库的xml格式数据,之前我在 UI线程bt我得到了ANR,它花费了很多时间 提取数据,所以我尝试了这段代码,这段代码运行良好 但仍然给我一个对话 请建议更好的方法 private Map<String, String> getSaleParams() { final String[] invSaleMasterXML = {""};
private Map<String, String> getSaleParams() {
final String[] invSaleMasterXML = {""};
final String[] invSaleTransactionXML = {""};
final String[] invSaleVoucherXML = {""};
final Map<String, String> params = new HashMap<>();
final DatabaseHandler databaseHandler = ApplicationController.getDatabaseHandler(mContext);
Runnable saleMasterRunnable = new Runnable() {
@Override
public void run() {
invSaleMasterXML[0] =databaseHandler.
getAllInventoryMasterRecords();
params.put("InvSaleMasterXML",
invSaleMasterXML[0]);
}
};
Thread saleMasterThread = new Thread(saleMasterRunnable);
Runnable saleTransactionRunnable = new Runnable() {
@Override
public void run() {
invSaleTransactionXML[0] = databaseHandler.
getAllInventoryTransactionRecords();
params.put("InvSaleTransactionXML",
invSaleTransactionXML[0]);
}
};
Thread saleTransactionThread = new
Thread(saleTransactionRunnable);
Runnable saleVoucherRunnable = new Runnable() {
@Override
public void run() {
invSaleVoucherXML[0] =
databaseHandler.getVoucherTableRecords();
params.put("InvSaleVoucherXML", invSaleVoucherXML[0]);
}
};
Thread saleVoucherThread = new Thread(saleVoucherRunnable);
saleMasterThread.start();
saleTransactionThread.start();
saleVoucherThread.start();
params.put("UserID",
ApplicationController.getSessionManager(mContext).getUserId());
try {
saleMasterThread.join();
saleTransactionThread.join();
saleVoucherThread.join();
return params;
} catch (InterruptedException e) {
e.printStackTrace();
}
return params;
}
私有映射getSaleParams(){
最后一个字符串[]invSaleMasterXML={”“};
最后一个字符串[]invSaleTransactionXML={”“};
最后一个字符串[]invSaleVoucherXML={”“};
final Map params=new HashMap();
final DatabaseHandler DatabaseHandler=ApplicationController.getDatabaseHandler(mContext);
Runnable saleMasterRunnable=new Runnable(){
@凌驾
公开募捐{
invSaleMasterXML[0]=数据库处理程序。
getAllInventoryMasterRecords();
params.put(“InvSaleMasterXML”,
invSaleMasterXML[0]);
}
};
线程saleMasterThread=新线程(saleMasterRunnable);
Runnable saleTransactionRunnable=新建Runnable(){
@凌驾
公开募捐{
invSaleTransactionXML[0]=数据库处理程序。
getAllInventoryTransactionRecords();
params.put(“InvSaleTransactionXML”,
invSaleTransactionXML[0]);
}
};
线程saleTransactionThread=new
线程(saleTransactionRunnable);
Runnable saleVoucherRunnable=new Runnable(){
@凌驾
公开募捐{
invSaleVoucherXML[0]=
databaseHandler.getVoucherTableRecords();
参数put(“InvSaleVoucherXML”,InvSaleVoucherXML[0]);
}
};
线程saleVoucherThread=新线程(saleVoucherRunnable);
saleMasterThread.start();
saleTransactionThread.start();
saleVoucherThread.start();
params.put(“UserID”,
ApplicationController.getSessionManager(mContext.getUserId());
试一试{
saleMasterThread.join();
saleTransactionThread.join();
saleVoucherThread.join();
返回参数;
}捕捉(中断异常e){
e、 printStackTrace();
}
返回参数;
}
join()仍然会导致UI线程等待结果加载。删除这些,改为实现侦听器方案。这样,UI线程就不会被阻塞
数据获取操作完成后,UI线程会收到通知,并可以更新视图。在此之前,您可以显示加载条或类似的内容
Runnable saleVoucherRunnable = new Runnable(){
@Override
public void run(){
// get data...
Activity.this.runOnUiThread(new Runnable(){
@Override
public void run(){
// update some views with the data
View view = findViewById(...);
view.setText(...);
}
});
}
};
可能重复感谢@Tobias bt正如您在我的共享代码中看到的,我有三种方法获取数据,我想确保所有三种方法都完成了获取数据,然后返回值。@SaurabhG您可以将所有可运行程序的获取逻辑放入一个可运行程序中。或者,实现第四个runnable,它在其他3个线程上执行
.join()
s,然后通过runOnUiThread()