2016-11-04 82 views
0

我有一个片段类的按钮单击我应该显示一个tableview与内容,这是取决于要显示的内容的时间跨度为4秒或更长。所以我想按钮点击后显示progressDialog,并在我的方法执行后关闭。ProgressDialog片段类不会立即出现在按钮单击后

但是这个过程在延迟之后出现,就像tableview出现之后一样。所以显示进度条会有延迟。我尝试了这么多方法仍然没有运气。

下面是我正在尝试的代码。

@Override 
    public void onClick(final View v) { 

     switch (v.getId()) { 
     case R.id.btn_spreadsheetAddTable: { 
      //Some code 
     } 
      break; 

     case R.id.btn_horizontalAddTable: { 

      AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { 
       @Override 
       protected Void doInBackground(Void... params) { 

        return null; 
       } 

       @Override 
       protected void onPreExecute() { 
        mProgressDialog = new ProgressDialog(getActivity()); 
        mProgressDialog.setTitle("Processing..."); 
        mProgressDialog.setMessage("Please wait."); 
        mProgressDialog.setCancelable(false); 
        mProgressDialog.setIndeterminate(true); 
        mProgressDialog.show(); 
        displayAddTableView(editIsEnabled); 

       } 

       @Override 
       protected void onPostExecute(Void result) { 
        if (mProgressDialog!=null) { 
         mProgressDialog.dismiss(); 

        } 
       } 
      }; 
      task.execute((Void[])null); 



      editIsEnabled = false; 

     } 

private void displayAddTableView(boolean editEnabled) { 
//A code to display dynamic table with dynamic data 
} 
} 

我一直在尝试通过以下网址也:

android - Progressbar Late Loading when button click

Loading Dialog, Progress Dialog on Button Click

ProgressDialog doesn't appear immediately

请帮我this.Thank你。

回答

0

可能是您的设备或模拟器很慢。你可以初始化进度对话框,然后再在onPreExecute显示此:

ProgressDialog mProgressDialog; 
. 
. 
.  //in oncreate 
     mProgressDialog = new ProgressDialog(getActivity()); 
     mProgressDialog.setTitle("Processing..."); 
     mProgressDialog.setMessage("Please wait."); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setIndeterminate(true); 


. 
. 
. 
protected void onPreExecute() { 
mProgressDialog.show(); 
+0

我试过了,仍然没有工作。 – reetu

+0

您是使用模拟器还是设备进行测试? –

1

你说这是服药4秒才能显示。听起来像你在做什么应该在后台线程中完成,而不是UI线程。也许你想在doInBackground执行displayAddTableView(editIsEnabled);,并发布任何UI更新。

mProgressDialog.show()导致邮件被张贴到UI消息队列,这意味着如果你的UI线程正忙于displayAddTableView(editIsEnabled);,进度微调不会显示(或将显示一秒钟,displayAddTableView(editIsEnabled);运行完毕后)。

+0

我试图从doInBacground()和table.show中调用displayAddTableView(editIsEnabled),它在displayAddTableView(editIsEnabled)中移动到onPostExecute。然后我的微调器出现在按钮点击。但是,在给出下面的异常java.lang.RuntimeException时崩溃:无法在未调用Looper.prepare()的线程中创建处理程序。 – reetu

+0

更新UI的'displayAddTableView'中的任何内容都需要放在对'runOnUiThread()'的调用中。 – pathfinderelite

+0

@reetu表视图也应该有一个'post'方法,它基本上做同样的事情。 – pathfinderelite

0

我已经解决了这个问题,方法是在UIThread中添加一个toast并运行表设计代码,因为无法显示进度,因为我的自定义表和进度的设计都需要在同一个线程中运行。

@Override 
public void onClick(final View v) { 

    switch (v.getId()) { 
    case R.id.btn_spreadSheetAddRow: { 


     Toast.makeText(this, 
       "Loading", 
       Toast.LENGTH_SHORT).show(); 

     final Thread uiThread = new Thread(new Runnable() { 

      @Override 
      public void run() { 

       uiHandler.postDelayed(new Runnable() { 

        @Override 
        public void run() { 

         //Call the heavy table design code; 

         Toast.makeText(getApplicationContext(), 
           "Done", 
           Toast.LENGTH_SHORT).show(); 

        } 
       }, 80); 
      } 
     }); 
     uiThread.start(); 
    } 
     break;