Eşzamansız görevin çalışmasını bitirmesini bekliyorum


86

Programlama konusunda çok yeniyim ve bazı şüphelerim var.

Bir tane var AsyncTask, diye adlandırdığım RunInBackGround.

ve bu işleme şöyle başlıyorum:

new RunInBackGround().execute();

Ancak diğer kod ifadelerine geçmeden önce bu çağrının yürütülmesini bitirmesini beklemek istiyorum.

Bunu nasıl yapabilirim?

Bunun herhangi bir yolu var mı?


2
AsyncTask'ın amacı, Asynchronous olmasıdır, yani kodun geri kalanıyla senkronize değildir.
Gjordis

3
Sınıfınızda geri arama almak için onPostExecute () of AsyncTask yöntemini kullanabilirsiniz.
DcodeChef

5
gerçekten bitene kadar beklemek istemezsiniz. İstediğin şey ne zaman bittiğini bilmek.
njzk2

3
@DcodeChef soruda ne istediğini anlayan tek kişidir.
Please_Dont_Bully_Me_SO_Lords

1
Sanırım aradığınız cevap budur stackoverflow.com/questions/13079645/…
user3362415

Yanıtlar:


131

bu aramanın yürütülmesini bitirene kadar bekleyin

Sonucu geri almak için AsyncTask.get () yöntemini çağırmanız ve doInBackgroundyürütme tamamlanana kadar beklemeniz gerekecektir . ancak bu, bir İş Parçacığı içinde get yöntemini çağırmazsanız Ana UI iş parçacığını dondurur .

UI İş Parçacığında sonucu geri almak için şu şekilde başlayın AsyncTask:

String str_result= new RunInBackGround().execute().get();

3
Öyleyse, sonucu nasıl bekleyip ana UI iş parçacığı kilitlenmez? kodun sonucu beklediğini, ancak bu arada ilerleme çubuğunun dönmeye devam ettiğini söyleyin!
Muhammad Naderi

2
@MuhammadNaderi: Kullanım AsyncTaskolmadan getyöntemi ve AsyncTask içinde onPostExecuteyöntemle u Ana UI Thread üzerinde hangi sonuçları sağlamak denir
ρяσѕρєя K

3
Emin bu şimdi ederken için kullanıyoruz geçici bir çözüm, ama bazen gibi asynctask için bir şeyler beklemek kodu için ihtiyaç awaithalinde c#ve tabii kilitli ana iş parçacığı alamadım
Muhammed Naderi

2
@ ρяσѕρєяK Teşekkürler, milyonlarca teşekkürler. Bu sorunun üzerinden ne kadar saç çektiğimi bilmiyorsun, ancak sadece bir .get () ile çözüldü (benimle dalga geçiyorsun) sadece bir .get () !!!!!
Code_Worm

AsyncTask'ı nasıl kullanabilir ve kullanıcı arayüzünün donmasını önlemek için get () kullanmaktan nasıl kaçınabilirsiniz?
Arjun Issar

37

Optimal olarak, kodunuzun paralel çalışabilmesi güzel olsa da, basitçe bir iş parçacığı kullanıyor olabilirsiniz, böylece uygulamanızın kullanım akışı beklemek zorunda olsa bile UI iş parçacığını engellemiyorsunuz.

Burada hemen hemen 2 seçeneğiniz var;

  1. Beklemek istediğiniz kodu AsyncTask'ın kendisinde çalıştırabilirsiniz. UI'yi (iş parçacığı) güncellemeyle ilgisi varsa, onPostExecute yöntemini kullanabilirsiniz. Arka plan çalışmanız bittiğinde bu otomatik olarak çağrılır.

  2. Herhangi bir nedenle Activity / Fragment / Whatever içinde yapmaya zorlanırsanız, AsyncTask'ınızdan yayınladığınız özel bir dinleyici de yapabilirsiniz. Bunu kullanarak, Activity / Fragment / Hangisi yalnızca istediğiniz zaman çağrılan şeyde bir geri arama yöntemine sahip olabilirsiniz: aka AsyncTask'ınız beklemeniz gereken şeyle tamamlandığında.


6
Bu müthiş bir cevap, kabul edilen cevap olmalı. Ayrıca AsyncTasks ile bunu nasıl başaracağınıza dair bir örnek: stackoverflow.com/questions/12575068/…
Jose Gonzalez

ikinci seçeneğinizde, Bu arada, alıcınıza niyet attığınızda, ana konu doğru şekilde devam edecektir. OP'nin buna ihtiyacı yok.
LincyTonita

16

Bir AsyncTaskProgressDialog ekleyin:

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);

Aşağıdaki onPreExecute()gibi bir yöntemdeMessage ayarlayabilirsiniz :

this.dialog.setMessage("Processing..."); 
this.dialog.show();

ve senin onPostExecute(Void result)yönteminde senin ProgressDialog.


15

AsyncTask'ın dört yöntemi vardır ..

onPreExecute  -- for doing something before calling background task in Async

doInBackground  -- operation/Task to do in Background

onProgressUpdate  -- it is for progress Update

onPostExecute  -- this method calls after asyncTask return from doInBackground.

onPostExecute()döndükten sonra çalışmanızı arayabilirsindoInBackground()

onPostExecute, Uygulamanız gereken şeydir.


1

Bence en kolay yol, verileri onpostexecute'tan almak ve Ui'yi arayüzden çalıştırmak için bir arayüz oluşturmak:

Bir Arayüz Oluşturun:

public interface AsyncResponse {
    void processFinish(String output);
}

Sonra asenkron görevde

@Override
protected void onPostExecute(String data) {
    delegate.processFinish(data);
}

Sonra ana faaliyetinizde

@Override
public void processFinish(String data) {
     // do things

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.