49 votes

Utiliser wait dans AsyncTask

Lorsque vous utilisez un wait dans un AsyncTask , j'obtiens ERROR/AndroidRuntime(24230): Caused by: java.lang.IllegalMonitorStateException: object not locked by thread before wait()

Est-il possible d'utiliser un Asynctask juste pour attendre ? Comment?

Merci

 class WaitSplash extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        try {
            wait(MIN_SPLASH_DURATION);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }       

    protected void onPostExecute() {
        waitSplashFinished = true;
        finished();
    }
}  

98voto

Flo Points 13170

Utilisez Thread.sleep() au lieu de wait() .

28voto

Luis Zandonadi Points 147

Vous pouvez utiliser la méthode Thread.sleep

     try {
        Thread.sleep(1000);         
    } catch (InterruptedException e) {
       e.printStackTrace();
    }

7voto

Rahul Jain Points 63
@Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            try {
                Thread.currentThread();
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;

        }

3voto

Rich Points 16818

Si vous souhaitez simplement reporter l'exécution d'une méthode pendant une durée définie, une bonne option est Handler.postDelayed()

définir le gestionnaire et exécutable...

 private Handler handler = new Handler();
private Runnable runnable = new Runnable() {        
    finished();
};

et exécuter avec retard...

 handler.postDelayed(runnable, MIN_SPLASH_DURATION);

1voto

Zoombie Points 1624

Utilisez des fils pour cela

 public class SplashActivity extends Activity{

int splashTime = 5000;
private Thread splashThread;
private Context mContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.mContext = this;
    setContentView(R.layout.splash_layout);
    splashThread = new Thread(){
        public void run() {
            try{
                synchronized (this) {
                    wait(splashTime);
                }
            }catch(InterruptedException ex){
                ex.printStackTrace();
            }finally{
                Intent i = new Intent(mContext,LocationDemo.class);
                startActivity(i);
                stop();
            }
        }
    };

    splashThread.start();
}

public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        synchronized (splashThread) {
            splashThread.notifyAll();
        }
    }
    return true;
}

sur l'événement tactile, le fil est notifié .. peut changer en fonction de vos besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X