线程实现

时间:2010-12-06 07:59:28

标签: android multithreading

当我按下我的登录按钮时有一个webservice调用,在web服务调用时我必须显示一个进度对话框,并在收到webservice后返回一个意图到下一页...但它总是显示一个空白页当调用intent时,也没有显示进度对话框

    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);                          
                        }

2 个答案:

答案 0 :(得分:2)

你应该在AsyncTask(智能背景线程)和ProgressDialog

的帮助下完成此操作

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

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

4个步骤

执行异步任务时,任务将经历4个步骤:

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

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

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

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

此课程必须遵循一些线程规则才能正常使用:

必须在UI线程上创建任务实例。 必须在UI线程上调用execute(Params ...)。 不要手动调用onPreExecute(),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();
    }
}

答案 1 :(得分:2)

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

按照以下步骤操作:

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

2.下载数据后,通过将必要的数据传递给它来启动下一个活动。