让splashactivity等一个过程

Let the splash activity wait a process

我的应用程序很受欢迎activity

至少要显示5秒

但是在这个activity中我有另一个线程从互联网同步数据

同步过程可能需要超过 5 秒或少于 5 秒。

如果小于 5 秒,Handler 应该等到第五秒

如果超过 5 秒,Handler 应该等到进程完成

如何让Handler等待另一个线程?

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

    syncFromInternet(); // another thread may over 5 seconds

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent;
            intent = new Intent(getApplicationContext(), SecondActivity.class);
            startActivity(intent);
        }
    }, 5000);

}

在执行线程后在 syncFromInternet() 中调用您的处理程序。

您应该实施 AsyncTask 以便这将等到您的 syncFromInternet() 完成。

    private class BackgroundSplashTask extends AsyncTask {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();

               // show progressbar            

            }

            @Override
            protected Object doInBackground(Object[] params) {
                try {

                        syncFromInternet(); // sync in background
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                return null;
            }

            @Override
            protected void onPostExecute(Object o) {
                super.onPostExecute(o);
         // dismiss progressbar     
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                startActivity(intent);  // go to SecondActivity after syncFromInternet is completed
                finish();

            }

       }

您可以使用 AsyncTask 实例并测量与远程服务器同步的时间。如果时间大于 5 分钟,则开始新的 activity,否则 - 等到第 5 秒:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {

        private static final long FIVE_SECONDS = 5 * 1000;
        private volatile Date mStartTime;

        @Override
        protected void onPreExecute() {
            mStartTime = new Date();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // Do the syncing here
            syncFromInternet();

            Date now = new Date();
            long execTime = now.getTime() - mStartTime.getTime();
            if(execTime < FIVE_SECONDS) {
                Thread.sleep(FIVE_SECONDS - execTime);
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            Intent intent = new Intent(...);
            startActivity(intent);
            finish();   
        }
    };
    asyncTask.execute(null, null);
}

您可以使用此代码:

package com.example.untitled;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.File;
import java.io.IOException;

public class MyActivity extends Activity {

    private volatile boolean isAvailable = false;
    private volatile boolean isOver = false;

    private Handler messageHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    if (isOver) {
                        Log.e("messageHandler","isOver");
                        transitToNewActivity();
                    }else {
                        Log.e("messageHandler","isOver false");
                    }
                    break;
            }
        }
    };

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        syncFromInternet(); // another thread may over 5 seconds

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                isOver = true;
                Log.e("mainHandler", "Main handler expired");
                if (isAvailable) {
                    transitToNewActivity();
                    Log.e("mainHandler", "isAvailable");
                }else {
                    Log.e("mainHandler","isAvailable false");
                }
            }
        }, 50000);

    public void transitToNewActivity() {
        Log.e("transitToNewActivity","Activity transited");
        Intent intent;
        intent = new Intent(getApplicationContext(), SecondActivity.class);
        startActivity(intent);
    }

    public void syncFromInternet() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(80000);
                    isAvailable = true;
                    messageHandler.sendEmptyMessage(0);
                    Log.e("syncFromInternet", "internet data synced");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
}

请根据您的要求进行修改。

你只需要简单的逻辑就可以了

处理程序完成后检查 syncFromInternet 方法是否完成,如果完成则打开主程序 Activity

当 syncFromInternet 完成后,检查处理程序是否完成,如果完成则打开 main Activity。

以上代码解释:

boolean isHandlerCompleted = false, isAsyncCompleted = false;

new Handler().postDelayed(new Runnable() {

    @Override
    public void run() {

        isHandlerCompleted = true;

        if (isHandlerCompleted && isAsyncCompleted) {
            openMainActivity();// both thread completed 
        }
    }
}, 5000);


// in your async task add this condition when it completes its task
isAsyncCompleted = true;

if (isHandlerCompleted && isAsyncCompleted) {
    openMainActivity();// both thread completed 
} // till this line

// make this function to open main activity
openMainActivity() {
    Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
    startActivity(intent);
}