2012-02-19 105 views
0

我有一個登錄屏幕,我正在使用我的應用程序。它調用JSON來驗證用戶名/密碼是否正確,如果是的話,它會將它們簽入並將它們定向到主菜單。但是,由於登錄需要大約10-15秒,因此我添加了一個非常簡單的「進度條」小部件,以顯示它實際上已登錄(所以用戶不會感到困惑)。但是,每當我在模擬器上測試並登錄時,登錄屏幕似乎都會凍結,然後在10-15秒鐘後它會很好地登錄,但由於AVD屏幕凍結,進度條從不顯示。我有它自己設置爲JSON調用時可見。如果我在成功登錄後返回登錄屏幕,進度條就在那裏,顯示得很好。Android AVD屏幕暫時凍結,同時調用JSON登錄

任何提示的方式來解決這個問題?多謝你們!

+0

您是否正在主線程上執行登錄請求?如果是,請考慮使用AsyncTask並檢查 - > http://developer.android.com/guide/practices/design/responsiveness.html 如果不是,您可以提供一些更多的細節,可能帶有一段代碼? – uaraven 2012-02-19 20:00:54

回答

4

我建議您使用AsyncTask來執行長時間的採集操作。並通知用戶使用ProgressBarAlertDialog或任何其他符合您需要的通知程序。

您應該考慮慢速網絡(2G,3G)和可能的數據速率限制,無論如何,可能會降低操作速度。

你的代碼應該在UI線程(這基本上就是UI線程)的另一個處理長時間的操作。

要了解AsyncTask的使用和目的,請考慮閱讀以下鏈接。

http://developer.android.com/reference/android/os/AsyncTask.html
http://developer.android.com/resources/articles/painless-threading.html
http://developer.android.com/guide/practices/design/responsiveness.html

+1

謝謝你的好朋友,我現在要給這些東西一個檢查。 – JMarsh 2012-02-19 20:06:37

1

嘗試使用這樣的事情,如果你在onCreate方法,例如登錄項。

public class YourActivity extends Activity { 
    private static ProgressDialog pd = null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.your_activity); 
     YourActivity.this.pd = ProgressDialog.show(YourActivity.this, 
         "Logging-in..", "Please wait...", true, false); 
     new DownloadTask().execute(your parameters); 
    } 

    private class DownloadImageTask extends AsyncTask<param, param, param> { 
     protected param doInBackground(param... params) { 
         //logging-in  
        } 
     protected void onPostExecute(your_result) { 
        if (YourActivity.this.pd != null) { 
         YourActivity.this.pd.dismiss(); 
        } 
       } 
    } 
    }