Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.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
Java 如何在所有线程完成执行后返回值_Java_Android_Multithreading - Fatal编程技术网

Java 如何在所有线程完成执行后返回值

Java 如何在所有线程完成执行后返回值,java,android,multithreading,Java,Android,Multithreading,我想买大号的 来自SQLite数据库的xml格式数据,之前我在 UI线程bt我得到了ANR,它花费了很多时间 提取数据,所以我尝试了这段代码,这段代码运行良好 但仍然给我一个对话 请建议更好的方法 private Map<String, String> getSaleParams() { final String[] invSaleMasterXML = {""};

我想买大号的 来自SQLite数据库的xml格式数据,之前我在 UI线程bt我得到了ANR,它花费了很多时间 提取数据,所以我尝试了这段代码,这段代码运行良好 但仍然给我一个对话

请建议更好的方法

    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()