Активность запуска отображается как пустой экран
Я делаю заставку для своего приложения и просто тестирую перевод основного потока в спящий режим вместо использования таймера. Мой код:
package com.example.somu.activityswitcher;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class LauncherActivity extends AppCompatActivity {
public void firstActivity() {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launcher);
TextView countDown = findViewById(R.id.count);
for (int cd=3;cd>0;cd--) {
try {
Thread.sleep(1000);
countDown.setText(Integer.toString(cd));
} catch (Exception e) {
e.printStackTrace();
}
}
firstActivity();
}
}
Хотя MainActivity загружается через 3 секунды, заставка (LauncherActivity) является просто пустым экраном! Что тут происходит?!
Activity_launcher.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.somu.activityswitcher.LauncherActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:scaleType="fitCenter"
android:scaleX="0.25"
android:scaleY="0.25"
app:srcCompat="@drawable/logo" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/count"
android:layout_centerHorizontal="true"
android:text="Switching in..." />
<TextView
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="70dp"
android:text="3"
android:textColor="@android:color/black"
android:textSize="50sp" />
</android.widget.RelativeLayout>
Как это исправить?!
ПРИМЕЧАНИЕ: меня не беспокоит какой-либо способ исправить это.. Я хочу знать, почему именно этот метод не будет работать, и каков следующий лучший способ без явного использования таймера.
6 ответов
Попробуйте это, может быть, это полезно для вас.
public class LauncherActivity extends AppCompatActivity {
private TextView countDown;
int cd;
public void firstActivity() {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
countDown = (TextView) findViewById(R.id.count);
try {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (cd = 3; cd > 0; cd--) {
countDown.setText(Integer.toString(cd));
}
firstActivity();
}
}, 3000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
если вы хотите добавить обратный отсчет, чем поставить этот обработчик,
new CountDownTimer(3000, 1000) {
public void onTick(long millisUntilFinished) {
countDown.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
countDown.setText("done!");
firstActivity();
}
}.start();
Попробуйте это вместо Thread.sleep(1000);
new CountDownTimer(3000, 1000) {
@Override
public void onTick(long l) {
countDown.setText(Integer.toString(l/1000));
}
@Override
public void onFinish() {
firstActivity();
finish();
}
}.start();
Ты используешь Thread.sleep(1000);
в основной теме, которая замораживает ваш пользовательский интерфейс.
Поскольку поток пользовательского интерфейса заморожен, в то же время активность не будет раздуваться и рендериться, в результате чего будет просто пустой экран.
Тем не менее, вы можете использовать Thread.sleep
в фоновом потоке, но вы не можете обновить интерфейс непосредственно из фонового потока. Ты можешь использовать runOnUiThread
обновить пользовательский интерфейс из фонового потока, если вы поместите код обратного отсчета внутри Thread
new Thread(new Runnable(){
public void run(){
//countdown code.
runOnUiThread(new Runnable(){
public void run(){
textView.setText(...
}
});
}
}).start()
try this code.
Intent intent = new Intent(this, WelcomeActivity.class);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
try{
startActivity(intent);
finish();
}
catch (Exception e){
}
}
}, 1000);
Попробуйте использовать CountDownTimer для отображения таймера вместо Thread или Handler, как показано ниже:
onTick()
работать в потоке пользовательского интерфейса, чтобы вы могли обновить пользовательский интерфейс в этом методе, пытаясь показать (3,2,1) в countDown TextView
,
onFinish
Вызывается, когда заданный таймер завершен, поэтому вы можете написать свой код здесь после завершения таймера, когда вы пытаетесь показать другое действие.
new CountDownTimer(3000, 1000) {
public void onTick(long millisUntilFinished) {
countDown.setText(""+ (millisUntilFinished / 1000));
}
public void onFinish() {
firstActivity();
}
}.start();
Thread.sleep(1000);
заморозить свой UI
,
попробуй это
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
timer = new Timer();
timer.scheduleAtFixedRate(new RemindTask(), 3000, 1000); // delay*/
}
private class RemindTask extends TimerTask {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
i++;
Log.e("title", "" + i);
tv.setText(i + "");
if (i == 3) {
timer.cancel();
firstActivity();
}
}
});
}
}