2010-12-06 82 views
1

当我按我的登录按钮有一个web服务调用,在web服务调用时,我必须显示进度对话框,并在接收web服务后返回到下一页的意图...但它总是diplays当意图也称进度对话框空白页面未显示线程实现

if(Utility.isNetworkAvailable(currActivity)){     
// Utility.showProgressDialog(currActivity); 
          new Thread() { 
           @Override 
           public void run() {        
            currActivity.runOnUiThread(new Runnable() { 
             @Override 
             public void run() { 
              Intent intent = new Intent(Login.this, Listviewer.class); 
              startActivity(intent); 
              tempSplashTread = new Thread() { // Thread for showing wait cursor 
               @Override 
               public void run() { 
                currActivity.runOnUiThread(new Runnable() { 
                 @Override 
                 public void run() { 
                  myProgressDialog = new ProgressDialog(InfraSignPdfList.this);  
                  myProgressDialog.setMessage("Loading...     "); 
                  myProgressDialog.show(); 
                 } 
                }); 
               } 
              }; 
              tempSplashTread.start(); 
              finish(); 
             } 
            }); 
           } 
          }.start(); 
         }else { 
          Utility.noNetworkDialog(currActivity);       
         } 
+3

请格式化您的代码,使其可读。 – 2010-12-06 08:01:58

回答

2

在启动应用程序之间插入进度对话框是一个坏主意。您需要在执行下载的实施对话框中实施进度对话框,然后在下载的数据传递到新活动后显示下一个活动。

遵循以下步骤:

1.After登录按钮来启动服务器调用来从服务器获取数据,直到然后显示progressDialog上的当前活动

2.数据下载完成后,通过将必要的数据传递给下一个Activity开始下一个Activity。

2

你应该与AsyncTask帮助(智能底色线程)和ProgressDialog

的AsyncTask做到这使正确且易于使用的用户界面线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

异步任务由在后台线程上运行并且其结果在UI线程上发布的计算定义。异步任务由3个泛型类型定义,称为Params,Progress和Result,以及4个步骤,分别称为begin,doInBackground,processProgress和end。

4个步骤

当执行一个异步任务,任务经过4个步骤:

onPreExecute(),调用执行任务之后立即在UI线程上。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

doInBackground(Params...),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数传递给此步骤。计算结果必须通过该步骤返回并返回到最后一步。此步骤还可以使用publishProgress(Progress ...)发布一个或多个进度单元。这些值在onProgressUpdate(Progress ...)步骤中发布在UI线程上。

onProgressUpdate(Progress...),在调用publishProgress(Progress ...)后在UI线程上调用。执行的时间是未定义的。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。例如,它可以用来为进度条设置动画效果或在文本字段中显示日志。

onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。 线程规则

有必须遵循此类才能正常工作的几个线程规则:

任务实例必须在UI线程上创建。 execute(Params ...)必须在UI线程上调用。 请勿手动调用onExExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。 任务只能执行一次(如果第二试图执行一个异常将被抛出。)

示例代码
什么适配器确实在这个例子中并不重要,更重要的是要明白,你需要使用AsyncTask显示进度对话框。

private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { 
    ProgressDialog dialog; 
    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(viewContacts.this); 
     dialog.setMessage(getString(R.string.please_wait_while_loading)); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 
    /* (non-Javadoc) 
    * @see android.os.AsyncTask#doInBackground(Params[]) 
    */ 
    @Override 
    protected ContactsListCursorAdapter doInBackground(Void... params) { 
     cur1 = objItem.getContacts(); 
     startManagingCursor(cur1); 

     adapter1 = new ContactsListCursorAdapter (viewContacts.this, 
       R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); 

     return adapter1; 
    } 

    protected void onPostExecute(ContactsListCursorAdapter result) { 
     list.setAdapter(result); 
     dialog.dismiss(); 
    } 
} 
+0

我会尝试taht – xydev 2010-12-06 08:37:34