Жүгіріп болғанда диалогты босатыңыз

Уақытты тұтынатын операция үшін Android-дегі ағынды жасаймын. Негізгі экранды операцияның орындалып жатқанын хабардар етіп, прогресс тілқатысу терезесін көрсетуін қалаймын, бірақ мен бұл диалог аяқталғаннан кейін босатылатын диалогты алғым келеді. Мен қосылуға тырыстым, бірақ ол жіпті құлыптайды және диалогты көрсетпейді. Мен пайдаланып көрдім:

dialog.show();
mythread.start();
dialog.dismiss(); 

бірақ диалог көрсетілмейді. Бұл тізбекті қалай жасауға болады, бірақ негізгі жіпті құлыптамай-ақ жіптің аяқталуын күтуге болады?

Бұл маған дейін:

public class syncDataElcanPos extends AsyncTask {
    ProgressDialog pDialog;
    Context cont;
    public syncDataElcanPos(Context ctx) {
        cont=ctx;
    }

    protected void onPreExecute() {
    pDialog = ProgressDialog.show(cont,cont.getString(R.string.sync), cont.getString(R.string.sync_complete), true);
}

protected Void doInBackground(String... parts) {        
  //blablabla...
   return null;
}

protected void onProgressUpdate(Integer... item) {
    pDialog.setProgress(item[0]);//just for possible bar in a future.
}

protected void onPostExecute(Void unused) {
    pDialog.dismiss();
}

Бірақ мен оны орындауға тырысқанда, ол маған «терезені қосу мүмкін емес» деген ерекшелік береді.

0

3 жауаптар

Жіберілгеннен кейін, диалогты жою үшін runOnUIThread әдісін қолданыңыз.

runOnUiThread(new Runnable() {
public void run() {
        dialog.dismiss();
    }
});
3
қосылды

Мұны істеудің екі жолы бар (және бірінші секундты артық көремін: AsyncTask):

First : you display your alertDialog , and then on the method run() you should do like this

@override
public void run(){
//the code of your method run 
//....
.
.
.
//at the end of your method run() , dismiss the dialog
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
        dialog.dismiss();
    }
});

}

Second : Using an AsyncTask like this :

class AddTask extends AsyncTask {

    protected void onPreExecute() {
//create and display your alert here 
    pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Downloading data ...", true);
}

protected Void doInBackground(Void... unused) {

   //here is the thread's work ( what is on your method run()
    items = parser.getItems();

    for (Item it : items) {
        publishProgress(it);
    }
    return(null);
}

protected void onProgressUpdate(Item... item) {
    adapter.add(item[0]);
}

protected void onPostExecute(Void unused) {
    //dismiss the alert here where the thread has finished his work
    pDialog.dismiss();
}
  }
1
қосылды

postexecute ішіндегі AsyncTask -де жақсы хабарласуға болады.

Міне, басқа мысалдан мысал

class AddTask extends AsyncTask {

    protected void onPreExecute() {
        pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true);
    }

    protected Void doInBackground(Void... unused) {
        items = parser.getItems();

        for (Item it : items) {
            publishProgress(it);
        }
        return(null);
    }

    protected void onProgressUpdate(Item... item) {
        adapter.add(item[0]);
    }

    protected void onPostExecute(Void unused) {
        pDialog.dismiss();
    }
  }
0
қосылды
AddTask сыныбын өзіңіздің Ішкі сыныпыңыз деп жариялайсыз ба? егер иә болса, онда ол жұмыс істейді, егер болмаса, контекстті AddTask класына жіберіңіз
қосылды автор Houcine, көзі
onCreate әдісінде өзіңіздің сыныпта syncDataElcanPos дегенді дәлелдеуіңіз керек: syncDataElcanPos instance = new syncDataElcanPos (this);
қосылды автор Houcine, көзі
Барлық көмекіңізге рахмет, AsyncTask опциясын таңдап, оның қалай өтетінін көріңіз ...
қосылды автор MarioV, көзі
Прогресс диалогындағы мәтінмәнді қалай қосуға болады? MyActivity.this бұл үшін жұмыс істемейді, ол бұл парамилермен жасай алмайды деп айтады, ол контекст емес, белсенділікті қабылдайды.
қосылды автор MarioV, көзі
Ия, мен тапсырманы орындадым, бірақ қазір кез келген идеяны алып тастаймын. коды негізгі сұрақ бөлігінде орналасқан.
қосылды автор MarioV, көзі