在启动闪屏之前运行的Android AsyncTasks中?

时间:2013-12-08 21:27:09

标签: android json multithreading android-asynctask

我有一个启动画面,我正在尝试运行一些AsyncTasks。在显示启动画面之前,AsyncTasks似乎正在运行。我需要启动屏幕(徽标和每个进程显示不同的消息)并开始运行asynctasks。我只是在吹码中使用书籍作为我所拥有的一个例子:

SplashScreen.java:

// Splash screen timer
    private static int SPLASH_TIME_OUT = 3000;
    TextView statusMessage;

    BookClubDB bookClubDB = new BookClubDB(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);

        statusMessage = (TextView) findViewById(R.id.statusMessage);

        statusMessage.setText("Checking For Connection");
        if(isNetworkAvailable()){
            statusMessage.setText("Connection Found");

            String appUpdateDate = null;
            appUpdateDate = lastUpdate();

            update1(appUpdateDate);
            update2(appUpdateDate);
            update3(appUpdateDate);
            update4(appUpdateDate);

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    endSplash();
                }

            }, SPLASH_TIME_OUT);
        }
        else {
            statusMessage.setText("No Connection Found");
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    endSplash();
                }

            }, SPLASH_TIME_OUT);
        }
    }

    public void endSplash(){

        Intent i = new Intent(SplashScreen.this, MainActivity.class);
        startActivity(i);

        // close this activity
        finish();

    }

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

    private String lastUpdate(){
        String updateDate = null;

        updateDate = bookClubDB.getUpdateDate();

        return updateDate;

    }

    private void update1(String appUpdateDate){

        statusMessage.setText("Updating Regions");
        bookClubDB.getAPI1(appUpdateDate);

    }

    private void update2(String appUpdateDate){

        statusMessage.setText("Updating Vehicles");
        bookClubDB.getAPI2(appUpdateDate);

    }

    private void update3(String appUpdateDate){

        statusMessage.setText("Updating Products");
        bookClubDB.getAPI3(appUpdateDate);

    }

    private void update4(String appUpdateDate){

        statusMessage.setText("Updating Documents, Images, and Video");
        bookClubDB.getAPI4(appUpdateDate);

    }

被调用的函数(updated1 ... 4)在名为BookClubDB.java的文件中调用另一个函数(getAPI1 ... 4)。第二组是在名为JASONParser.java的文件中运行asynctasts的。函数和解析器工作。只有asynctasks在启动画面显示之前运行。

我希望弹出屏幕弹出“检查连接” - > “找到连接” - >每个函数在运行时都会更新。

JSONParser.java是一个简单的json解析器,它将json结果返回给BookClubDB.java:

JSONObject output = new JSONParser().execute(new String[] {bookClubURL,consumerKey,sharedSecret}).get();

该函数接受json,将其转换为jsonArray,然后用它填充数据库。一切都按需要运行,只有asynctasks运行得太快。

如何在asynctask线程之前启动启动画面的线程?我看过其他SO答案,但他们从来没有真正回答过我。

3 个答案:

答案 0 :(得分:0)

您正在活动的OnCreate方法中运行所有代码。此时UI尚未显示。

查看Android文档中的活动生命周期,然后根据该文档进行重写。

答案 1 :(得分:0)

我猜这种情况正在发生,因为当活动仍在创建时,你正在活动的onCreate中触发asynctasks。 如果我理解正确,您只希望在显示启动画面后触发它们。

onResume是一个很好的回调。

此外,请注意您同时触发所有updatexx方法,并且每次都会覆盖状态消息。

答案 2 :(得分:0)

可能是因为您在主线程上设置了消息文本。

如果在主线程上运行一些更改太快,则不必执行它们,也可能导致UI滞后。

基本上你的应用就是这样:

- >的OnCreate

- > setText(“检查连接”)

- >的setText( “OnConnectionFound”)

- > setText(“更新区域”)

- >安排新的AsyncTask来更新区域

- > setText(“正在更新车辆”)

- >安排新的AsyncTask来更新车辆

..... update3,4 ......

现在只有系统才开始执行异步任务。 (它不一定非常严格,特别是在多核处理器上。有可能f.e.region asyncTask在update3 setText之前启动,但它确实在之前没有完成) 但是有一件事你需要意识到:所有这些调用都非常快,可能不会超过几毫秒。并且UI不经常更新(也不会注意到它)。

因此文本更新太快/根本不更新。

你提到你正在使用AsyncTask,这很好。您可能只需将setText调用放入onPreExecute / onPostExecute / onProgressChanged方法(基于您希望更改文本的时间),它将正常工作。这些方法旨在在适当的时间在UI线程上调用,因此确保将呈现所有UI操作:)