gpt4 book ai didi

android - 自定义启动画面以在 Android 中加载变量

转载 作者:搜寻专家 更新时间:2023-11-01 09:12:25 27 4
gpt4 key购买 nike

我开始研究这个:Android SplashScreen我的应用程序与此方法完美配合。不幸的是,我已经开发了一个自定义启动画面(不是像其他帖子中那样的进度对话框)并且我无法使用相同的方法。我的闪屏是一个不同的 Activity ,我开始从 onCreate 作为不同的线程调用它。

而不是 this.pd = ProgressDialog.show(this, "Working..", "Downloading Data...", true, false); 在 onCreate 我做的:

        Thread splashThread = new Thread() {
@Override
public void run() {
// start the splash screen activity
}
};
splashThread.start();
}

启动画面 Activity 正确启动。因此,我在默认方法(doInBackground、onPostExecute)中调用 AsyncTask,并且在所有变量都加载到 doInBackground 中之后,我无法结束运行启动画面的 Activity 并返回到主要 Activity 。

有什么建议吗?

最佳答案

好吧,我终于感谢 JPM 提出的使用处理程序的建议,我解决了这个问题:

public class SplashScreen extends Activity {

private static Handler mHandler ;
private static Handler mainHandler ;

protected static final int CLOSE_SPLASH = 0 ;

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

mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
switch(msg.what){
case CLOSE_SPLASH:
finish();
break;
}

}
};
}

@Override
public void onStart(){
super.onStart();
if(mainHandler != null){
mainHandler.sendEmptyMessage(MainActivity.START_LOAD);
}
}

@Override
public boolean onKeyDown (int keyCode, KeyEvent event){
if(keyCode == KeyEvent.KEYCODE_BACK){
mainHandler.sendEmptyMessage(MainActivity.ABORT_LOAD);
}
return super.onKeyDown(keyCode, event) ;
}
public static void setMainHandler(Handler h){
mainHandler = h ;
}
public static void sendMessage(Message msg){
mHandler.sendMessage(msg);
}
public static void sendMessage(int w){
mHandler.sendEmptyMessage(w);
}
}

在 MainActivity 中,我来回管理处理程序:

public class MainActivity extends Activity {

private MainActivity _this;
private Handler mHandler;

protected static final int FINISH_LOAD = 0 ;
protected static final int START_LOAD = 1 ;
protected static final int ABORT_LOAD = 2 ;

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

_this = this;

mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case FINISH_LOAD:
SplashScreen.sendMessage(SplashScreen.CLOSE_SPLASH);
break;
case START_LOAD:
initializing();
break;
case ABORT_LOAD:
finish();
}

}
};
startSplash();
}

private void startSplash() {
Intent intent = new Intent(this, SplashScreen.class);
SplashScreen.setMainHandler(mHandler);
startActivity(intent);
}

private void initializing() {
new Thread() {
@Override
public void run() {
long start_time = android.os.SystemClock.uptimeMillis();
doTheHeavyJob();
long duration = android.os.SystemClock.uptimeMillis() - start_time;
if (duration <=3000) {
try {
wait(3000-duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mHandler.sendEmptyMessage(FINISH_LOAD);
}
}.start();
}
}

通过这种方式,我可以管理 doTheHeavyJob() 函数并在两种情况下完成 SplashScreen:在作业完成后,至少在 3000 毫秒后,即显示我的启动画面的最短持续时间。我还想在 anddev 意大利网站上对 Teskio 进行测试,因为这里完成了大部分工作。

关于android - 自定义启动画面以在 Android 中加载变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7321665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com