15

Bazı arka plan hesaplamaları gerçekleştirmek için AsyncTask kullanıyorum ancak özel durumları ele almak için doğru bir yol bulamıyorum. Ben değişken e maye hem ana ve işçi iş parçacığı tarafından erişilen/yazılabilir inanıyoruzAsynctask Hata Giderme

private class MyTask extends AsyncTask<String, Void, String> 
{ 
    private int e = 0; 

    @Override 
    protected String doInBackground(String... params) 
    { 
     try 
     { 
      URL url = new URL("http://www.example.com/"); 
     } 
     catch (MalformedURLException e) 
     { 
      e = 1; 
     } 

     // Other code here... 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     if (e == 1) 
      Log.i("Some Tag", "An error occurred."); 

     // Perform post processing here... 
    } 
} 

: Şu anda aşağıdaki kodu kullanıyorum. Bildiğim kadarıyla onPostExecute() sadece doInBackround() bittikten sonra çalıştırılacak, herhangi bir senkronizasyon atlayabilir miyim?

Bu kötü kod mu? AsyncTask'daki istisnaları işlemek için kabul edilmiş veya doğru bir yolu var mı?

+1

olası yinelenen (http://stackoverflow.com/questions/1739515/asynctask-and-error-handling-on-android) – blahdiblah

cevap

3

Uygulamalarımda bunu yapıyorum, sanırım daha iyi bir yol yok.

Ayrıca bu konuda Mark Murphy answer okuyabilirsiniz.

+0

hiçbir neden olursa sorunlar o zaman ben mutluyum! – Leo

2

Bu SMP mimarisinde bile çalışacağı garanti edilir. Tüm senkronizasyon sizin için yapılır. Bununla birlikte, bunun için dönüş değerini kullanmak daha iyi olacaktır.

+1

Gerçek kodda, özel durum bilgilerini tutmada kendini göstermeyen dönüş türü olarak özel bir nesne kullanıyorum. 'OnPostExecute()' işlevini çok kolay yükleyemediğimi var mı? – Leo

+4

Her şeyden önce, doInBackground, onPostExecute() parametresiyle aynı türde bir nesne döndürmelidir. Ardından, sonucu + istisnasını kapsüllemek için özel bir sınıf oluşturabilirsiniz: class ResultHolder {Exception e; MyResult r; } –

2

Kodunuzun işe yaradığını düşünüyorum, ancak zaten AsyncTask sınıfında bir tür hata işleme var.

cancel() yöntemini ve işleyici yöntemini onCancelled() kullanarak fazladan bir değişken kullanmaktan kaçınabilirsiniz. Aradığınızda, doInBackground() yöntemini kullanarak UI iş parçacığındaki onCancelled yöntemini iptal edin. İptal (true) veya iptal (false) çağrıları sizin ihtiyaçlarınıza göre değişir.


private class MyTask extends AsyncTask<String, Void, String> 
{  
    @Override 
    protected NewsItem doInBackground(String... params) 
    { 
     try 
     { 
      URL url = new URL("http://www.example.com/"); 
     } 
     catch (MalformedURLException e) 
     { 
      cancel(false/true); 
     } 

     // Other code here... 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    {    
     // Perform successful post processing here... 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
     // Perform error post processing here... 
    } 
} 
[AsyncTask ve hata Android'de işleme] arasında
+0

Bu yöntem, yalnızca bir tür özel durumumuz varsa çalışır. Tam kodumda yanlış gidebilecek birçok şey var ve bunlar farklı şekilde ele alınmalı. – Leo

+0

Neden? Try-cümleciğe istediğiniz kadar catch sınıfı ekleyebilirsiniz. Her catch ifadesinde iptal metodunu kullanabilirsin. Ayrıca, her türlü İstisnaları yakalayan (İstisna e) yakalayabilirsiniz. Doğru mu anladım Leo? Ancak, İstisnalar atıldığında veya başka bir özel durum işleme yöntemi uygulandığında iptal() çağrısı yapmak iyi bir uygulamadır mı? – OneWorld

+0

Hatayı işlemenin iptal() yolu, gerçekte olana çok yakındır. İşleminiz bir hata nedeniyle iptal edildi. Hatanın ne olduğu hakkında daha fazla bilgi edinmek için kullanıcı arabirimi tarafından okunabilen ASyncTask'ta bazı durumları kaydedebilirsiniz. – DukeMe