编辑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();});
}
在进行后台工作时显示进度条的功能已被多次询问,例如here或here。
我的问题是我正在根据传入数据动态构建主要活动内容。我在启动活动期间下载数据,因此很容易将其作为后台任务运行(因为其中没有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);
到目前为止,我看到的所有示例都无法正常运行,因为它们依赖于已在其中创建活动的按钮单击。
答案 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来代替
如下定义全局字段:
ProgressBar progressBar;
通过代码将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;
}
然后,完成此操作后,请使用以下方法禁用整个视图:
Window.SetFlags(WindowManagerFlags.NotTouchable, WindowManagerFlags.NotTouchable);
创建一个在调用UpdateInterface
方法时要运行的异步任务;
private async void DoATask()
{
progressBar.Visibility=ViewStates.Visible;
await UpdateInterface();
progressBar.Visibility=ViewStates.Gone;
}
注意: UpdateInterface()
方法应该是System.Threading.Tasks.Task,而不是Void,因为void无法为其定义一个等待者,因此该方法无效。
在您的OnResume
或OnCreate
中,在UIThread中运行
protected override void OnResume()
{
base.OnResume();
_activity.RunOnUiThread(DoATask);
}
希望这对您有帮助,并且在您遇到查询时恢复正常