Android 登录活动在启动活动后崩溃

Android 登录活动在启动活动后崩溃,android,android-developer-api,Android,Android Developer Api,我正在从事一个android项目,其中包括登录、注册、主要活动和一个Splash活动。 因此,除了飞溅活动,所有活动都会崩溃。 首先执行启动活动,然后主活动崩溃 以下是Splash活动: 这是Manifest.xml文件 必须执行登录活动、注册活动、主活动 主要动机是 启动活动之后,必须执行登录活动。最好使用以下代码 new Handler().postDelayed(new Runnable() { @Override public void run() {

我正在从事一个android项目,其中包括登录、注册、主要活动和一个Splash活动。 因此,除了飞溅活动,所有活动都会崩溃。 首先执行启动活动,然后主活动崩溃

以下是Splash活动:

这是Manifest.xml文件

必须执行登录活动、注册活动、主活动 主要动机是
启动活动之后,必须执行登录活动。

最好使用以下代码

 new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {

           Intent mainintent = new Intent(SplashActivity.this, LoginActivity.class);
            startActivity(mainintent);finish()


        }
    }, 2000);

然后从onResume中删除finish

首先将活动名称MainActivity从清单文件更改为LoginActivity

<activity android:name="com.example.connect2every1.LoginActivity ">

    </activity>

您不能从工作线程更改UI,只有主线程可以更改UI,所以在启动活动时使用runOnUiThread

Thread splash=new Thread(){
    public void run() {
        synchronized (this) {
            try {
                wait(2000);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        startActivity(new Intent(getApplicationContext(),LoginActivity.class));
                        finish();
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};
splash.start();
您是否在AndroidManifest.xml中注册了所有活动

如果您这样做了,您将无法在没有处理程序的情况下从非UI线程切换UI

因此,为了让代码正常工作,您需要在UI线程中初始化一个处理程序,并在UI线程或非UI线程中发布一个可运行实例,无论有无延迟

这是密码

public class SplashActivity extends AppCompatActivity {

    private mHander Handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        mHander = new Handler();
    }

    @Override
    public void onPostCreate(){
        mHander.postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this,LoginActivity.class));
                finish();
            }
        },5000);
    }
}
并去除饰面;从onPause方法,因为当前活动在Runnable执行时自动关闭


希望这有帮助

从Logcate添加粉碎日志您通常不需要启动屏幕。你也可以使用一个处理程序而不是线程。即使我不使用启动活动,它也会崩溃。为什么你甚至需要启动屏幕的计时器?只需将启动活动代码放入onResume中,而不使用计时器。从onpauseen删除finishcall,即使我不使用Splash活动,它也会崩溃。如果我直接执行一个登录活动作为我的第一个活动,那么它也会崩溃,不仅是登录活动,而且还有主、注册活动。对于启动屏幕来说,使用计时器是不好的做法。若您并没有在Splash中进行任何处理或验证,那个么您只需在onResume中调用starts活动即可。最重要的是,必须在startYes之后调用finish,我同意你的观点,但他不需要这个解决方案。如果你在manifest中更改活动,你必须在java文件中重命名它,还必须在其他文件中更改它的引用,那么需要更改名称吗?
<activity android:name="com.example.connect2every1.MainActivity">

    </activity>
Handler handler=new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this,LoginActivity.class));
                finish();
            }
        },4000);
Thread splash=new Thread(){
    public void run() {
        synchronized (this) {
            try {
                wait(2000);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        startActivity(new Intent(getApplicationContext(),LoginActivity.class));
                        finish();
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};
splash.start();
public class SplashActivity extends AppCompatActivity {

    private mHander Handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        mHander = new Handler();
    }

    @Override
    public void onPostCreate(){
        mHander.postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this,LoginActivity.class));
                finish();
            }
        },5000);
    }
}