2012-02-19 65 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(); 
        } 
       } 
    } 
    }