当前位置: 首页 > 知识库问答 >
问题:

如何在我的功能执行期间显示加载消息?

潘彦
2023-03-14

有些函数需要很长时间才能执行。我想让用户用进度条等待。不幸的是,当我运行这个函数时,它只在函数结束时运行,而不是在我想要的时候。让我解释一下,我使用“sendloading()”方法启动进度条,但在测试期间,该进度条仅在处理其他函数“copyAssets”或“createOnClicBtnInsert()”后显示。有人能解释一下原因吗?

这是我的代码:

 @Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    view.findViewById(R.id.btnInsertDataset2).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!hasPermissions(getContext(),Permissions)){
                lay_dataset2 = view.findViewById(R.id.lay_dataset2); 
                messagePerm();
            }else {
                sendLoading(); //MY PROGRESS BAR
                btnInsert = view.findViewById(R.id.btnInsertDataset2);
                /** if perm ok -> insert*/
                copyAssets();
                createOnClicBtnInsert();
                view.findViewById(R.id.btnDeleteDataset2).setEnabled(true);
                Toast.makeText(getContext(), "Insert Success", Toast.LENGTH_SHORT).show();
            }


        }
    });
}

以下是我的进度条代码

    public void sendLoading() {
    int llPadding = 30;
    LinearLayout ll = new LinearLayout(getContext());
    ll.setOrientation(LinearLayout.HORIZONTAL);
    ll.setPadding(llPadding, llPadding, llPadding, llPadding);
    ll.setGravity(Gravity.CENTER);
    LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    ll.setLayoutParams(llParam);

    ProgressBar progressBar = new ProgressBar(getContext());
    progressBar.setIndeterminate(true);
    progressBar.setPadding(0, 0, llPadding, 0);
    progressBar.setLayoutParams(llParam);

    llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    TextView tvText = new TextView(getContext());
    tvText.setText("Loading ...");
    tvText.setTextColor(Color.parseColor("#000000"));
    tvText.setTextSize(20);
    tvText.setLayoutParams(llParam);

    ll.addView(progressBar);
    ll.addView(tvText);

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setCancelable(true);
    builder.setView(ll);

    AlertDialog dialog = builder.create();
    dialog.show();
    Window window = dialog.getWindow();
    if (window != null) {
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        layoutParams.copyFrom(dialog.getWindow().getAttributes());
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        dialog.getWindow().setAttributes(layoutParams);
    }

}

共有2个答案

裴鸿熙
2023-03-14

如果运行时存在递归条件,则可能发生这种情况。如果需要,只需使用progressbar。设置可见性=视图。可见在您想要显示它的地方,默认情况下,它仍然是progressbar。设置可见性=视图。看不见

夏和雅
2023-03-14

Android是一个事件驱动的操作系统,运行在一个主线程上。绘画是一件大事。这意味着为了绘制主线程,需要返回事件循环。在完成所有处理之前,代码不会返回到事件循环。因此,在处理完成之前,它不会绘制。

解决这个问题的方法是使用线程或Kotlin协程进行处理,并允许主线程返回到事件循环。顺便说一句,如果你有长时间的处理,你无论如何都不应该在主线程上进行处理——它会冻结你的用户界面,使你的应用程序看起来没有响应,原因也是一样的。主线程应该进行简短的快速计算,并且只响应操作系统事件。

 类似资料:
  • 问题内容: 我对Flask还是比较陌生,总体而言有点网络菜鸟,但是到目前为止,我取得了一些不错的成绩。现在,我已经有了一个表单,用户可以在其中输入查询,该查询被赋予一个函数,该函数可能需要5到30秒的时间才能返回结果(使用Freebase API查找数据)。 问题是我无法让用户知道他们的查询正在这段时间内加载,因为结果页面仅在函数完成工作后才加载。有什么办法可以显示正在加载的消息吗?我发现一些Ja

  • 问题内容: 页面完全加载后,我需要执行一些JavaScript代码。这包括图像之类的东西。 我知道您可以检查DOM是否准备就绪,但是我不知道这是否与页面完全加载时相同。 问题答案: 叫做。在DOM准备就绪之前就已经出现了问题,实际上是由于等待图像的确切原因而创建了DOM ready 。

  • 问题内容: 我只是想知道如何显示指示异步请求正在运行的图像。我使用以下代码执行异步请求: 有任何想法吗? 问题答案: 当然,您可以在发出请求之前显示它,并在请求完成后隐藏它: 我通常更喜欢将其绑定到全局ajaxStart和ajaxStop事件的更通用的解决方案,这样它就可以显示在所有ajax事件中:

  • 问题内容: 为了使IM Client始终保持登录状态,Facebook通过在将页面插入文档之前使用AJAX加载页面来避免整个页面加载。 但是,在Facebook AJAX请求期间,浏览器似乎正在加载。重新加载按钮变为X,浏览器中内置的进度指示器指示正在加载/正在等待等) 我已经能够成功实现基于AJAX的导航,但是我的浏览器没有显示任何加载迹象(由于请求是异步的),Facebook如何做到这一点?

  • 问题内容: 目前,我有一个Angular.js页面,它允许搜索并显示结果。用户单击搜索结果,然后单击“后退”按钮。我希望再次显示搜索结果,但是我不知道如何触发搜索执行。详细信息如下: 我的Angular.js页面是一个搜索页面,带有一个搜索字段和一个搜索按钮。用户可以手动键入查询并按下按钮,然后会触发ajax查询并显示结果。我用搜索词更新了网址。一切正常。 用户单击搜索结果,然后转到另一个页面-效

  • 本文向大家介绍leaflet加载geojson叠加显示功能代码,包括了leaflet加载geojson叠加显示功能代码的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了leaflet加载geojson叠加显示功能代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 geojson需要先制作shp,然后导入下面网站生成geojson。 ht