Utiliser wait in AsyncTask

en utilisant 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 l'attente? 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();
    }
}  
38
demandé sur Quentin Dunand 2011-05-25 14:14:27

6 réponses

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

87
répondu Flo 2014-03-26 18:47:33

Vous pouvez utiliser Thread.méthode de sommeil

    try {
        Thread.sleep(1000);         
    } catch (InterruptedException e) {
       e.printStackTrace();
    }
26
répondu Luis Zandonadi 2011-08-23 23:24:47
@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;

        }
6
répondu Rahul Jain 2015-01-14 05:49:08

si vous cherchez à simplement reporter l'exécution d'une méthode pour une durée déterminée, une bonne option est Gestionnaire.postDelayed ()

définir le handler et runnable...

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

et exécuter avec retard...

handler.postDelayed(runnable, MIN_SPLASH_DURATION);
3
répondu Rich 2011-05-25 10:19:30

Utilisez des threads 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 événement de touche, fil être averti.. peut changer en fonction de votre besoin.

1
répondu Zoombie 2015-08-15 14:37:59

Vous avez cette façon de travailler avec asyntask et wait();

public class yourAsynctask extends AsyncTask<Void, Void, Void> {
    public boolean inWait;
    public boolean stopWork; 

    @Override
    protected void onPreExecute() {
        inWait = false;
        stopWork = false;
    }

    @Override
    protected Void doInBackground(Void... params) {
        synchronized (this) {
            while(true) {
                if(stopWork) return null;
                if(youHaveWork) {
                    //make some
                } else {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        return null;
    }

    public void mynotify() {
        synchronized (this) {
            if(inWait) {
                notify();
                inWait = false;
            }
        }
    }

    public void setStopWork() {
        synchronized (this) {
            stopWork = false;
            if(inWait) {
                notify();
                inWait = false;
            }
        }
    }
}
0
répondu Cifus 2014-11-21 10:47:11