2013-05-07 59 views
0

我想顯示進度對話框「裝載」,而我的應用程序打開。應用Progressdialog啓動時不工作

我試過的AsyncTask和其他一些方法(Uithread,線程)來做到這一點,所有的都失敗了。

我不知道爲什麼,但progressdialog沒有顯示在我的手機屏幕上。我總是看到一個黑屏。

getApnData拋出異常後,我的活動UI組件顯示,進度對話框的作品,但爲時已晚

下面是一些我的代碼部分。

//1-1-1-1-1 
//On create or OnStart 

LoginProgressTask task1 = new LoginProgressTask(); 
     task1.execute(); 

//Inner class 
    class LoginProgressTask extends AsyncTask<String, Integer, Boolean> { 
     @Override 
     protected Boolean doInBackground(String... params) { 
      try { 
       getApnData(); // Do your real work here 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return Boolean.TRUE; // Return your real result here 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      LoginUI.this.pd = ProgressDialog.show(LoginUI.this, "", "Loading...", true, true); 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      // LoginUI.this.pd.dismiss(); 

     } 
    } 

//2-2-2-2-2 
//OnCreate or OnStart 
pd = ProgressDialog.show(this, "", "Loading...", true, false); 

thread = new Thread(this); 
thread.start(); 


//run 
@Override 
    public void run() { 
     try { 
      firstRunUI(); 
      handler.sendEmptyMessage(0); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

//UIRun 
    public void firstRunUI() { 
     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        getApnData(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 
    } 

//Handler 
private Handler handler = new Handler() { 
     public void handleMessage(Message msg) { 
      pd.dismiss(); 


     } 
    }; 

回答

2

好吧首先, 您可以使用下面的場景顯示進度:

  1. 使用您LoginProgressTask如下

    新LoginProgressTask()執行();

  2. 變化

    LoginUI.this.pd = ProgressDialog.show(LoginUI.this, 「」, 「載入中...」,真,真)

  3. 使用上使用以下的onCreate或在onStart而不是在問題你的第二個代碼塊的

    新LoginProgressTask()執行()。

這裏有一個完整的示例

class SomeActivity extends Activity { 
     ProgressDialog pd ; 
     class LoginProgressTask extends AsyncTask<String, Integer, Boolean> { 
     @Override 
     public void onPreExecute(){ 
     pd = ProgressDialog.show(LoginUI.this, "", "Loading...", true, true); 
     } 
       @Override 
       protected Boolean doInBackground(String... params) { 
        try { 
         getApnData(); // Do your real work here 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        return Boolean.TRUE; // Return your real result here 
       } 
     } 

     @Override 
      protected void onPostExecute(Boolean result) { 
       pd.dismiss(); //or use handlers it is better 

      } 
     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
        new LoginProgressTask().execute(); 
    } 
    } 

這將做的工作適合你!

河畔確保您關閉ProgressDialog上PostExecute方法*

注意 不要創建主UI線程意見,因爲這可能導致內存泄漏

更新 要更新從getAbnData() UI元素,您應該使用處理程序

Handler handler = new Hanlder(){ 
    @Override 
    public void handleMessage(int what){ 
//changing UI Elements code comes here 

} 
} 

從代碼使用處理程序。的sendMessage(NUMER)

,然後它會處理消息

Communicating with the UI Thread

+0

不爲工作,幫助我的一些朋友。他是Android開發新手。我曾嘗試過這種方法,他們工作正常。 – Tugrul 2013-05-07 13:50:05

+0

@tgrll這將爲你做這份工作!並不意味着你實際工作的工作,但它是做代碼的工作或工作的首字母縮略詞!也就是說,請不要誤會,如果解決方案有效,給我們一個反饋意見 – 2013-05-07 13:54:09

+0

對不起,錯誤理解。 Yeap它正在工作,我的代碼現在正在工作。我以前在我的項目中嘗試過這種方法,並且它們工作正常。 但不是在這個項目中。這聽起來很奇怪。他的代碼不復雜。例如,在getApnData()中,他到達UI元素並更改其中的一些元素。 setText,setEnabled等。 我修復了部分代碼和進度對話框,現在顯示。 但在一段時間內,它正在旋轉,之後它鎖定。 仍然需要幫助。 – Tugrul 2013-05-07 13:58:05

1

這段代碼你解決你的問題,甚至不使用的AsyncTask。希望它可以幫助你。

private void Load() { 
     // TODO Auto-generated method stub  
     p = new ProgressDialog(YourActivity.this); 
     p.setMessage("Loading..."); 
     p.setCancelable(false); 
     p.show(); 

     new Thread(new Runnable() { 
      public void run() { 
       // TODO Auto-generated method stub     
       mHandler.sendEmptyMessage(0); 
      } 
     }).start(); 
    } 
} 

private Handler mHandler = new Handler() { 
    public void handleMessage(android.os.Message msg) { 
     super.handleMessage(msg); 
     p.dismiss(); 
     switch (msg.what) { 

     case 0: 
      //LOAD YOUR ACTIVITY HERE 
      break; 
     } 
    } 
}; 
+0

我做同樣的事情在我的codepart-2。 – Tugrul 2013-05-07 13:30:42

+0

我檢查了我自己,它工作,錯誤是在codepart-1。你測試了我的代碼嗎?屏幕是否保持黑色? – cgalvao1993 2013-05-07 13:45:59

+0

是的黑色,但我找到了解決辦法。但只有部分解決方案。此時進度對話框被鎖定。 – Tugrul 2013-05-07 13:49:17