我使用AsyncTask执行SplashScreen活动来检查文件是否存在。如果它们存在,则启动MainActivity类else启动Downloader类。
问题是当splashscreen完成时,它会运行MainActivity意图两次或Downloader意图两次。我使用的是Android版GINGERBREAD
package com.example.myapp;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.Window;
import android.view.WindowManager;
public class SplashScreen extends Activity {
// base path of application
private final String basePath = Environment.getExternalStoragePublicDirectory("MyApp").getAbsolutePath() +
"/files";
// files to check
private final String[] filenames = {
"file1.txt",
"file2.txt",
};
private boolean isOK = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.activity_splash);
Thread background = new Thread() {
public void run() {
try {
// Thread will sleep for 5 seconds
sleep(5 * 1000);
// After 5 seconds redirect to another intent
// If is ok to start
if (isOK) {
Intent i = new Intent(getBaseContext(), MainActivity.class);
startActivity(i);
}
// Else download required files
else {
Intent i = new Intent(getBaseContext(), DownloadScreen.class);
startActivity(i);
}
//Remove activity
finish();
} catch (Exception e) {
}
}
};
// check if all required files exists
new CheckFiles().execute(filenames);
// start thread
background.start();
}
@Override
public void onBackPressed() {
android.os.Process.killProcess(android.os.Process.myPid());
}
private class CheckFiles extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... filenames) {
for (String filename : filenames) {
File file = new File(basePath + filename);
if (file.exists())
continue;
else return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
isOK = result;
}
}
}
答案 0 :(得分:0)
这种情况发生的原因是,当您{SpladerScreen®活动finish()
时,它会通过重新创建它回到您的MainActivity
,这意味着它会再次呼叫onCreate()
,如果您没有&#39} ; t停止了你之前的Thread
,它会启动另一个,所以它会为同一件事开始两个意图。
----编辑----
要检查Thread
是否正在运行,我建议在类范围内定义一个boolean
变量来控制它。将其设置为false
,一旦进入,请将其设置为true
。
然后,在.start()
上致电Thread
之前,请检查变量是否为false
。如果是这样,
称之为,否则,不要这样做,因为它将启动另一个实例并将被复制。
// start thread
if (!isAlreadyStarted)
background.start();
答案 1 :(得分:0)
你在做什么看起来很奇怪和坏。你有一个背景Thread
来检查睡眠后的值,看起来是什么,是一个任意的时间。您可以删除Thread
并将该代码放入函数中。然后,当任务在onPostExecute()
结束时,您可以调用此函数。像
protected void onPostExecute(Boolean result) {
goToActivity(result);
}
private void goToActivity(boolean ok)
{
isOK = ok;
Intent i;
if (isOK) {
i = new Intent(getBaseContext(), MainActivity.class);
}
// Else download required files
else {
i = new Intent(getBaseContext(), DownloadScreen.class);
}
startActivity(i);
//Remove activity
finish();
}