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
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