我在里面有一个pdf文件的android应用程序。当我在较低配置的设备(galaxy 2等)上打开我的应用程序时,加载PDF文件需要一段时间。我尝试在我的应用程序中添加启动画面,但在MainActivity.class
仍然占用相同时间之后打开SplashScreen
。如何开发真正的加载屏幕?它应该在Main Activity
图层之上工作。
这里是我的代码:
的AndroidManifest.xml
<activity
android:name=".SplashScreen"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity"></activity>
</application>
</manifest>
SplashScreen.class
public class SplashScreen extends AppCompatActivity {
private GifImageView gifImageView;
private ProgressBar progressBar;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
gifImageView=(GifImageView)findViewById(R.id.gifview);
progressBar=(ProgressBar)findViewById(R.id.progressbar);
progressBar.setVisibility(progressBar.VISIBLE);
try {
InputStream inputStream = getAssets().open("loading.gif");
byte[] bytes = IOUtils.toByteArray(inputStream);
gifImageView.setBytes(bytes);
gifImageView.startAnimation();
}
catch (IOException ex)
{
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = newIntent(SplashScreen.this,MainActivity.class);
SplashScreen.this.startActivity(intent);
SplashScreen.this.finish();
}
},12000);
}
}
在这里我的代码如何解决这个问题?
答案 0 :(得分:1)
您是否考虑过使用异步任务? 您可以在MainActivity中使用异步任务。
例如,您可以执行以下操作:
class PDFLoader extends AsyncTask<Void, Void, Void>
{
protected void onPreExecute (){
super.onPreExecute();
// Here you can instantiate the Progressdialog to show the progress.
}
protected String doInBackground(Void...arg0) {
// here you can go ahead write the reading logic for the PDF
// if it is taking time.
}
protected void onProgressUpdate(Integer...a){
super.onProgressUpdate(a);
// you may or may not use this. This can act as a progress updated based on
// the integer.
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
// Here you can dismiss the progress bar since the read as been done.
}
}
在MainActivity中将其命名为:
new PDFLoader().execute();
我希望这会对你有所帮助。 这只是让您入门的基本结构。更多信息here。
答案 1 :(得分:0)
使用启动画面不是解决方案。您正在添加一个12秒间隔的屏幕,12秒后MainActivity类正在执行。 因此,您可以直接在MainActivity类中添加进度条,并且可以使用 AsyncTask 来解决此问题。 AsyncTask有3种方法 - OnPreExecute,doInBackground,OnPostExecute。在这里,您可以在OnPreExecute方法中添加进度条和在doInBackground方法中打开PDF文件的代码,最后在OnPostExecute方法中停止进度条。
如需更多帮助,请在此处提供 MainActivity 类代码。
答案 2 :(得分:0)
您可以创建 LoadingScreen 而不是启动画面(查看12秒延迟)。这可能会有所帮助:
public class LoadingScreen {private ImageView loading;
LoadingScreen(ImageView loading) {
this.loading = loading;
}
public void setLoadScreen(){
final Integer[] loadingImages = {R.mipmap.loading_1, R.mipmap.loading_2,
R.mipmap.loading_3, R.mipmap.loading_4};
final Handler loadingHandler = new Handler();
Runnable runnable = new Runnable() {
int loadingImgIndex = 0;
public void run() {
loading.setImageResource(loadingImages[loadingImgIndex]);
loadingImgIndex++;
if (loadingImgIndex >= loadingImages.length)
loadingImgIndex = 0;
loadingHandler.postDelayed(this, 500);//change to accordingly(i.e. 12000)
}
};
loadingHandler.postDelayed(runnable, 500); // change it accordingly
}}
在MainActivity中,您可以像这样传递给LoadingScreen类: -
private ImageView loadingImage;
不要忘记在activity_main中添加ImageView。之后,像这样调用LoadingScreen类;
LoadingScreen loadingscreen = new LoadingScreen(loadingImage);
loadingscreen.setLoadScreen();
创建自定义加载屏幕而不是Splash屏幕总是有帮助。也不要忘记添加一些不同的图像,使其感觉像 gif ,之后添加图像res
文件夹。我也检查了它的低版本因此,相信它可能符合你的目的......
答案 3 :(得分:0)
你应该试一试这篇文章:https://antonioleiva.com/branded-launch-screen/ 它比Splash Screen好得多,因为它会为你的MainActivity加载异步
将此代码添加到样式:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar" />
<style name="AppTheme.BrandedLaunch" parent="AppTheme">
<item name="android:windowBackground">@drawable/branded_logo</item>
</style>
现在将braded_logo.xml创建到drawable目录
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<color android:color="@color/background_material_light"/>
</item>
<item>
<bitmap
android:src="@drawable/launch_logo_image"
android:tileMode="disabled"
android:gravity="center"/>
</item>
</layer-list>
并将该样式分配到您的MainActivity
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.BrandedLaunch">
最后将setStyle添加到MainActivity中onCreate的默认主题
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
...
答案 4 :(得分:0)
现在很多应用程序都因为UI / UX不好而无法加载屏幕。您可以使用替代内容加载。这个article可能会有所帮助。你可以在很多流行的应用程序上看到这种实现,如Facebook,LinkedIn,Upwork等。