Android多线程 - 如何从Executor服务通知主线程

时间:2017-09-19 02:10:11

标签: android multithreading executorservice

我正在尝试通知主线程Executor服务执行的所有Callables都已完成。

目前,我有一个闪屏活动,只显示动画图像。在此活动的OnCreate方法中,我在多线程中加载应用程序数据。现在我想在不锁定UI线程的情况下执行goToMainMenu()方法。

使用预期的以下代码,方法task.get()将停止UI线程。

我可以通过在((ApplicationClass) getApplication()).getApplicationData().LoadApplicationData(); 方法上调用doInBackground()来完成我想要的Async任务,但是在Async线程中混合线程听起来不是正确的做法。

我的申请类:

public class ApplicationClass extends Application {

    private ApplicationData applicationData;

    public ApplicationData getApplicationData()
    {
        return applicationData;
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
        applicationData = new ApplicationData(this);
    }
}

我的活动:

public class SplashScreenActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((ApplicationClass) getApplication()).getApplicationData().LoadApplicationData();
        goToMainMenu();
    }

    private void goToMainMenu() {
        Intent content = new Intent(SplashScreenActivity.this, ContentActivity.class);
        content.putExtra("menu", getString(R.string.nav_title_news));
        startActivity(content);
        finish();
    }
}

我的ApplicationData类:

public final class ApplicationData {

Context c;
//There are more Variables to store work by Callables methods


public ApplicationData(Context context) {
    this.c = context;
}

public void LoadApplicationData() throws Exception {
        int PROCESSES = 6;
        ExecutorService executor = Executors.newFixedThreadPool(PROCESSES);
        List<Callable<Void>> callables = Arrays.asList(
                new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        LoadEventsLocations(c.getResources().getString(R.string.webserviceeventslocations));
                        return null;
                    }
                }, new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        LoadTags(c.getResources().getString(R.string.webservicetags));
                        return null;
                    }
                }, new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        homehtml = LoadHtml(c.getResources().getString(R.string.urlhome), c.getResources().getString(R.string.classarticletext), "home");
                        return null;
                    }
                }, new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        objhtml = LoadHtml(c.getResources().getString(R.string.urlobjectives), c.getResources().getString(R.string.classarticletext), "obj");
                        return null;
                    }
                }, new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        contactshtml = LoadHtml(c.getResources().getString(R.string.urlcontacts), c.getResources().getString(R.string.classcontacts), "contacts");
                        return null;
                    }
                }, new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        commissionhtml = LoadHtml(c.getResources().getString(R.string.urlcommission), c.getResources().getString(R.string.classarticletext), "commission");
                        return null;
                    }
                });
        for (Future<Void> task : executor.invokeAll(callables))
            task.get();
        executor.shutdown();

    }

//There are more methods but keep it simple :)

}

你们建议我做什么?

0 个答案:

没有答案