线程无法正常工作

时间:2016-03-14 15:32:22

标签: android

我想将splash.xml显示6秒,然后显示activity_main.xml,但它没有显示activity_main.xml ...

我的splash.java代码:

    package com.example.ne;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;

    public class splash extends Activity{

     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);
            Thread timer = new Thread()
            {
                public void run(){
                    try{
                        sleep(6000);


                    } catch(InterruptedException e){
                        e.printStackTrace();

                    }finally{
                        Intent open =new     Intent("com.example.ne.MAINACTIVITY");
                        startActivity(open);
                    }
                }
            };
            timer.start();

     }


}

和mainactivity.java代码:

    package com.example.ne;

    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class MainActivity extends Activity {


    int counter;
    Button add,sub;
    TextView display;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        counter=0;
        add=(Button) findViewById(R.id.bAdd);
        sub=(Button)findViewById(R.id.bSub);
        display=(TextView)findViewById(R.id.tvdisplay);
        add.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View arg0) {
                counter++;
                // TODO Auto-generated method stub
                display.setText("Your total is" + counter);

            }
        });sub.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View arg0) {
                counter--;
                display.setText("Your total is" + counter);
                // TODO Auto-generated method stub

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

和manifest.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ne"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.ne.splash"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
 <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity" android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.example.ne.MAINACTIVITY" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

</manifest>

3 个答案:

答案 0 :(得分:2)

并不是说你不能按照自己的方式去做,但管理线程比看起来更棘手。这就是为什么Android为它添加了许多帮手。在您的情况下,您可以使用Handler发布延迟的runnable,它将充当您的重定向。

new Handler().postDelayed(new Runnable(){
    @Override
    public void run(){
        Intent open = new Intent(splash.this, MainActivity.class);
        startActivity(open);
        splash.this.finish();
    }
}, 6000);

这将使您不必管理任何线程,并在意图通过后关闭启动活动。

其次,如果您注意到,Intent实例化new Intent(splash.this, MainActivity.class),这就是您应该创建活动意图的方式。这将为明确调用的intent提供上下文。

第三,根据Java命名约定,类splash应该是Splash。 Camel case是合适的,但类的首字母大写,而方法和变量的首字母小写。

最后,你的清单看起来应该是这样的

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ne"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity" 
            android:label="@string/app_name" />
    </application>
</manifest>

修改

根据@JHH的建议,也可以阻止启动页面重定向后退或主屏幕等内容。你可以做的是:

首先,创建类变量mHandlermRunnable,然后在实例化对象时,让变量引用它们。

private Handler mHandler;
private Runnable mRunnable;

@Override
public void onCreate(Bundle savedInstanceState){
    ...
    mHandler = new Handler();
    mRunnable = new Runnable(){...};
    ...
}

接下来,让处理程序在onResume上发布延迟发布runnable消息。这将允许我们在每次启动活动到达前面时创建帖子消息(请记住,重定向后,启动屏幕将完成,因此这不会成为问题)。

@Override
public void onResume(){
    super.onResume();
    postDelayed(mRunnable, 6000);
}

最后,在onPause中,我们可以像这样停止延迟发布。这将使处理程序不会触发意图,因此如果启动画面在后台,则重定向不会发生。换句话说,如果您点击启动画面然后点击后退/主页按钮,则运行状态不会继续并打开活动。

@Override
public void onPause(){
    mHandler.removeCallbacks(mRunnable);
    super.onPause();
}

答案 1 :(得分:0)

尝试改为

Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

答案 2 :(得分:0)

在代码中进行以下更改

Package com.example.ne;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class splash extends Activity{

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        Thread timer = new Thread()
        {
            public void run(){
                try{
                    sleep(6000);


                } catch(InterruptedException e){
                    e.printStackTrace();

                }finally{
                    Intent open =new Intent(splash.this,MainActivity.class);
                    startActivity(open);
                }
            }
        };
        timer.start();

   }

   }