在Activity的OnCreate()期间显示进度条?

时间:2018-11-27 08:36:06

标签: c# android xamarin.android

编辑1

这是我现在拥有的代码,试图减轻单独线程上的繁重工作。

protected override void OnCreate(Android.OS.Bundle bundle)
{
    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);
}
protected override void OnResume()
{
   base.OnResume();

ThreadPool.QueueUserWorkItem(_ => BuildInterfaceForConnectedUser());
}

private void BuildInterfaceForConnectedUser()
{
    RunOnUiThread(() => { UpdateInterface();});
}

在进行后台工作时显示进度条的功能已被多次询问,例如herehere

我的问题是我正在根据传入数据动态构建主要活动内容。我在启动活动期间下载数据,因此很容易将其作为后台任务运行(因为其中没有UI访问权限)。另一方面,构建内容 可能要花几秒钟,我想将进度告知用户。

基本上,OnResume()中有很多工作。伪代码:

protected override void OnResume()
{
     base.OnResume();

     UpdateInterface(); // Build the content dynamically
}

在这段时间内,主要活动没有显示。

在构建最终内容时,如何使用进度条使主要活动在后台显示为模糊?

它是通过“登录”活动中的以下内容开始的:

Intent intent = new Intent(this, typeof(MainActivity));
if(Intent.Extras != null) intent.PutExtras(Intent.Extras);
StartActivity(intent);

到目前为止,我看到的所有示例都无法正常运行,因为它们依赖于已在其中创建活动的按钮单击。

2 个答案:

答案 0 :(得分:1)

  

基本上,OnResume()中有很多工作。

onResume()中不应该做很多工作。在单独的线程上开始这项工作,然后将结果通知UI线程。

在Java / Kotlin中,可以使用AsyncTask轻松完成此操作,也可以使用传统的Thread + Handler

编辑:

使用Java和AsyncTask的等效方法。

public class Activity extends Activity{ 
 public void onCreate(){
   super(/*...*/);
   setContentView(splash_layout_id);
 }

 public void onResume(){
   super(/*...*/);
   task.execute();
 }

private AsynkTask task = new AsynkTask(){

   void doInBackground(){
     // this runs in the background
     Object data;

     while(data = fetchingData() != null){
      // this calls onProgressUpdate()
      publishProgress(data);
     }
   }

   void onProgressUpdate(Object progress) {
     // this runs on UI thread    
     updateUiRelativeToProgress(progress);
   }

   void onPostExecute(Object data) {
     // this runs on UI thread and called when doInBackground() returns 
     updateUi(data);
   }
 };

} 

答案 1 :(得分:0)

我通常如何做到这一点实际上很简单。

由于API- 26中不推荐使用ProgressDialog,所以我倾向于使用ProgressBar来代替

  1. 如下定义全局字段:

    ProgressBar progressBar;
    
  2. 通过代码将ProgressBar添加到View到TopMost布局中,该布局应始终为RelativeLayout,如下所示:

      RelativeLayout layout = *Assignment*; // Assign your main relative layout here.
      RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(100, 100);
      relativeParams.AddRule(LayoutRules.CenterInParent);
      progressbar= GetProgressBar(this)
      layout.addView(progressbar,params);
    

    GetProgressBar是通用的静态方法,如下所示:

      public static ProgressBar GetProgressBar(Activity _activity)
        {
            var progressBar = new ProgressBar(_activity, null, Android.Resource.Attribute.ProgressBarStyleLarge);              
            progressBar.Visibility=ViewStates.Visible;  //To show ProgressBar
            progressBar.Visibility=ViewStates.Gone;     // To Hide ProgressBar
            return progressBar;
        }
    
  3. 然后,完成此操作后,请使用以下方法禁用整个视图:

    Window.SetFlags(WindowManagerFlags.NotTouchable, WindowManagerFlags.NotTouchable);
    
  4. 创建一个在调用UpdateInterface方法时要运行的异步任务;

    private async void DoATask()
    {
       progressBar.Visibility=ViewStates.Visible; 
       await UpdateInterface();
       progressBar.Visibility=ViewStates.Gone; 
    }
    

    注意: UpdateInterface()方法应该是System.Threading.Tasks.Task,而不是Void,因为void无法为其定义一个等待者,因此该方法无效。

  5. 在您的OnResumeOnCreate中,在UIThread中运行

     protected override void OnResume()
     {
        base.OnResume();
         _activity.RunOnUiThread(DoATask);
     }
    

希望这对您有帮助,并且在您遇到查询时恢复正常