0

我在 Android 中有一个活动,它显示为背景图片。当我单击背景时,我使用 anintent来进行另一个活动......这是我的代码的样子:

public class Precisari extends Activity{

    protected boolean _active = true;
    protected int _splashTime = 10000;
    public SplashThread  splashThread;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.precisari);

     splashThread=new SplashThread();

    }


    public class SplashThread extends Thread
    {
        public SplashThread()
        {

        }


        public void run() {

            try {

                int waited = 0;
                while (_active && (waited < _splashTime)) {
                    sleep(100);
                    if (_active) {

                        waited += 100;
                    }
                }
            } catch (InterruptedException e) {
                // do nothing
            } finally {
                //finish();
                Intent i = new Intent(getBaseContext(), com.SplashScreen.ConnectWithFb.class);
                startActivity(i);
                stop();

            }
        }

    }



    public boolean onTouchEvent(MotionEvent event){
        if(event.getAction()==MotionEvent.ACTION_DOWN){

            _active=false;
            }
        return true;
    }


    public void onResume(){
        super.onResume();
        _active=true;
        splashThread.start();
    }

    public void onPause()
    {
        super.onPause();
        splashThread.stop();

    }


}

我正在使用我开始的线程onResume()......这个线程循环,直到布尔_active变量设置为 false 。当我点击模拟器的屏幕时,变量设置为 false:

public boolean onTouchEvent(MotionEvent event){
            if(event.getAction()==MotionEvent.ACTION_DOWN){

                _active=false;
                }
            return true;
        }

然后我通过使用意图传递到下一个活动:

Intent i = new Intent(getBaseContext(), com.SplashScreen.ConnectWithFb.class);

线程开始onResume()并停止在onPause()。想法是,当我回到这个活动时,我希望同样的想法起作用....当我点击屏幕时传递到下一个活动!

这是我的 logcat 的样子:

 Uncaught handler: thread main exiting due to uncaught exception
 java.lang.RuntimeException: Unable to resume activity {com.SplashScreen/com.SplashScreen.Precisari}: java.lang.IllegalThreadStateException: Thread already started.
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2950)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2965)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1889)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4363)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.IllegalThreadStateException: Thread already started.               at java.lang.Thread.start(Thread.java:1322)
    at com.SplashScreen.Precisari.onResume(Precisari.java:101)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
    at android.app.Activity.performResume(Activity.java:3763)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2937)

请有人告诉我我做错了什么?

4

2 回答 2

1

您收到该异常的原因是因为停止并重新启动单个 Thread 对象实例是非法的。您分别在 onResume/onPause 中调用 start/stop,但从未重新分配线程对象(来自 onCreate)。

为了停止和重新启动线程,您需要重新分配 Thread 对象。

Android 源代码在这方面相当明确:

// Thread.java, line ~178
/**
 * Reflects whether this Thread has already been started. A Thread
 * can only be started once (no recycling). Also, we need it to deduce
 * the proper Thread status.
 */
boolean hasBeenStarted = false;

// Thread.java, line ~1043
public synchronized void start()
{
    if (hasBeenStarted) {
        throw new IllegalThreadStateException("Thread already started."); // TODO Externalize?
    }

    hasBeenStarted = true;  // <--- Look here!

    VMThread.create(this, stackSize);
}

hasBeenStarted永远不会重置为 false - 即使线程退出也是如此。

于 2012-05-02T22:08:38.817 回答
-3

将 sleep(100) 放在 try catch 块中。

于 2011-07-15T11:14:36.353 回答