2010-08-14 35 views
5

Benim Faaliyetlerimde LoveFilm kuyruğunda bir kullanıcı film indirmek için kullandığım ama ProgressDialog hiçbir zaman görünmüyor.ProgressDialog görünmüyor

public class MyListActivity extends Activity { 
    SharedPreferences prefs; 
    ProgressDialog m_progressDialog; 
    Thread listThread; 
    User user; 

    private Runnable threadProc_initializeQueue = new Runnable() { 
     public void run() { 
      user.fetchQueues(); 
      Queue defaultQueue = user.getDefaultQueue(); 
      defaultQueue.fetchTitles(); 

      m_progressDialog.dismiss(); 
     } 
    }; 

    /* (non-Javadoc) 
    * @see android.app.Activity#onCreate(android.os.Bundle) 
    */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     prefs = getSharedPreferences(getString(R.string.app_name), MODE_PRIVATE); 

     // Authenticate the user if needs be. 
     if(!prefs.getBoolean("isAuthenticated", false)) { 
      Intent i = new Intent(this, OAuthActivity.class); 
      startActivity(i); 
      finish(); 
     } else { 
      // Get the users default list. 
      LoveDroid app = (LoveDroid) getApplication(); 
      user = new User(app); 

      m_progressDialog = ProgressDialog.show(MyListActivity.this, "Please Wait", "Loading", true); 
      listThread = new Thread(null, threadProc_initializeQueue); 
      listThread.run(); 
     } 

    } 

Ben bu sorunla diğerlerini gördüm ve hepsi temelde maden

m_progressDialog = ProgressDialog.show(MyListActivity.this, "Please Wait", "Loading", true); 
kodun kalan işleri

, kullanıcılar filmler aracılığıyla indirilir benzeyen bir çizgi öneren etrafında olsun iş parçacığı, ancak iletişim kutusu hiç gösterilmiyor, birkaç saniye sürüyor, görüntülenme zamanından önce iletişim kutusunun işten atılması gibi bir şey değil.

cevap

7

daha iyi olur (yerine dişin - genellikle Android faaliyetlere iyi bir uygulamadır).

Bir AsyncTask sınıfı oluşturun ve bu sınıfta onPreExecute öğesinde bir ilerleme iletişim kutusu ekleyin ve onPostExecute öğesinde onu reddedin. Bir örnek here bulabilirsiniz. onCreate at ProgressDialog.show (...) (...) çağrılması

  1. (bunu görmez çünkü genelde problemlidir: Bunun dışında

    , kodunuzda birkaç sorunlar var arka plan etkinliğiniz bittikten sonra genellikle onCreate bitene kadar devam eder).

  2. İlerleme iletişim kutusundaki tüm işlemler yalnızca UI iş parçacığı üzerinde gerçekleştirilmelidir, bu nedenle bazı rasgele iş parçacığı üzerinde m_pd.dismiss() öğesini kullanamazsınız (bu nedenle AsyncTask kullanmalısınız).
+0

AsyncTask sınıfını kontrol etmeliyim - Daha önce hiç kullanmadım ve çok yararlı görünüyor. İlerleme diyalogları ile dismiss() çağrısı aslında herhangi bir iş parçacığından çağrılabilir, ancak yöntemlerin geri kalanının UI iş parçacığından çağrılması gerekir. –

+0

Amitlicht'de dikkatiniz çekti, bir AsyncTask & eveything ile işin yerine geçtim, çok teşekkürler. –

+0

ancak daha sonra iletişim nesnesi preExecute yöntemine yerel mi? –

1

MyListActivity.this yerine this ile arama yaparsanız ne olur?

Bu, inCreate() içinde olduğundan, olası bir UI iş parçacığından çağrılmadığı halde mümkün değildir. runOnUiThread (çağrısıyla çevreleyen

deneyin): Eğer AsyncTask kullanırsanız

Activity me = this; 
    runOnUiThread(new Runnable() 
    { 
     public void run() 
     { 
      m_progressDialog = ProgressDialog.show(me, "Please Wait", "Loading", true); 
     } 
    });