jjzjj

android - progressDialog 动画在大型 setText() 上暂停

coder 2023-11-25 原文

我试图在 EditText 中设置大文本,该操作可能需要 30 多秒,所以我使用 ProgressDialog。它出现了,但没有动画,然后在操作完成后消失。这是我的简化代码:

class FileOpener extends AsyncTask<File, Integer, String> {

    private ProgressDialog progress;

    @Override
    protected void onPreExecute() {
        progress = new ProgressDialog(context);
        ...
        progress.show();
    }

    @Override
    protected StringBuilder doInBackground(File... files) {
        return readFile();
    }


    @Override
    protected void onPostExecute(String content) {
        EditText editText = ...
        editText.post(new Runnable() {
            @Override
            public void run() {
                editText.setText(content);
                progress.dismiss();
            }
        });
    }
}

如何在设置文本时使进度对话框动画化?

我也试过在 onPostExecute 中使用它,同样的事情,对话框在那里但没有动画...

EditText editText = ...
new Thread() {
    @Override
    public void run() {
        editor.setText(content);
        progress.dismiss();
    }
}.start();

编辑 - 这不是关于我的 EditText 速度的问题,据我所知,这很糟糕。这个问题是here .无论我如何提高速度,设置文本对于大文件总是需要几秒钟,即使是顶级编辑应用程序也不需要。这个问题真正是关于如何保持加载对话框动画,因为目前,在 EditText 中设置文本时它不会动画。我不知道如果不是在 UI 线程中,UI 上什么都不能改变,那么我该如何更新/动画加载?如果这是不可能的,或者太复杂或太麻烦,那么我该如何在设置文本时显示任何类型的加载动画。

最佳答案

你应该能够最小化动画暂停/停止 通过创建一个 EditText 并在您的 doInBackground 中设置其文本并将其添加到您的 onPostExecute(ui 线程)中查看。下面是一个使用 Activity 和您已有的任务变体以及一些代码注释的示例:

public class Activity extends AppCompatActivity {

    /**
     * dummy edit text (or the old one if doing an update)
     */
    private EditText dummyEditTextForShow;
    /**
     * that dummy's parent
     */
    private ViewGroup viewGroupToAddEditTextTo;
    /**
     * that dummy's position in it's parent
     */
    int indexOfDummy;
    /**
     * your progress dialog
     */
    private ProgressDialog progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // create the things
        progress = new ProgressDialog(this);
        dummyEditTextForShow = new EditText(this);
        // show the place holder
        setContentView(dummyEditTextForShow);
        // get its parent and index in parent
        viewGroupToAddEditTextTo = (ViewGroup) dummyEditTextForShow.getParent();
        indexOfDummy = viewGroupToAddEditTextTo.indexOfChild(dummyEditTextForShow);
        new FileOpener().execute();
    }

    class FileOpener extends AsyncTask<File, Integer, EditText> {

        @Override
        protected void onPreExecute() {
            progress.show();
        }
        @Override
        protected EditText doInBackground(File... files) {
            EditText newEditText = new EditText(Activity.this);
            newEditText.setText(readFile());
            return newEditText;
        }

        @Override
        protected void onPostExecute(EditText editText) {
            //get rid of old for the new
            ViewGroup.LayoutParams oldLayoutParams = dummyEditTextForShow.getLayoutParams();
            viewGroupToAddEditTextTo.removeView(dummyEditTextForShow);
            viewGroupToAddEditTextTo.addView(editText, indexOfDummy, oldLayoutParams));
            progress.hide();
            dummyEditTextForShow = editText
        }
    }
}

我使用 http://www.webpagefx.com/tools/lorem-ipsum-generator/loremipsum/paragraphs 测试了上面的内容 段落数:100 大小:46929字节

设置为一个字符串值 fiftykb 然后非常懒惰地创建另一个字符串 all 并将其设置为新的编辑文本(而不是你的 readFile()):

String all = fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb;
newEditText.setText(all)

结果是动画永远不会停止,但是有一个短暂的时刻(< 1="" 秒)编辑文本是空白的,然后显示所有文本并且是可编辑的。="">

HTHs!

关于android - progressDialog 动画在大型 setText() 上暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41783913/

有关android - progressDialog 动画在大型 setText() 上暂停的更多相关文章

  1. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby-on-rails - Rails 3 - 过滤器链暂停为 :authentication rendered or redirected - 2

    我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User

  4. LVGL V8动画 - 2

    动画/*INITIALIZEANANIMATION 初始化一个动画*-----------------------*/lv_anim_ta;lv_anim_init(&a);/*MANDATORYSETTINGS 必选设置*------------------*//*Setthe"animator"function 设置“动画”功能*/lv_anim_set_exec_cb(&a,(lv_anim_exec_xcb_t)lv_obj_set_x);/*Setthe"animator"function*/lv_anim_set_var(&a,obj);/*Lengthoftheanim

  5. ruby - Carrierwave + MiniMagick - 如何将动画 GIF 压缩到第一帧? - 2

    有人知道如何使用Carrierwave+MiniMagick将动画GIF压缩到第一帧吗? 最佳答案 我认为MiniMagick有一些变化,因为我只花了三个小时试图找出为什么Andrey的代码对我不起作用。我收到以下错误:ActiveRecord::RecordInvalid(Validationfailed:ImageFailedtomanipulatewithMiniMagick,maybeitisnotanimage?OriginalError:Command("mogrify-scene/var/folders/0o/0oqN

  6. ruby - 使用 ruby​​-yajl 解析大型 JSON 哈希? - 2

    我有一个包含JSON散列的大文件(>50Mb)。像这样的东西:{"obj1":{"key1":"val1","key2":"val2"},"obj2":{"key1":"val1","key2":"val2"}...}与其解析整个文件并取前十个元素,不如解析散列中的每个项目。我实际上并不关心key,即obj1。如果我将上面的转换为:{"key1":"val1","key2":"val2"}"obj2":{"key1":"val1","key2":"val2"}我可以使用Yajl流轻松实现我想要的:io=File.open(path_to_file)count=10Yajl::Parse

  7. ruby-on-rails - 将大型 Rails 应用程序分解成较小的应用程序? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我有一个包含600个模型的Rails应用程序,很快就会增加到800-1000个。我想对Rails应用程序进行分段,以便仅加载某些模型,因此充当单独的应用程序,但所有模型都共享相同的基本模型。是否有执行此操作的标准做法?编辑:我在2.3.8编辑2:问题是许多模型是相似的,但不同之处恰恰足以保证编写一个新类,也就是说,将所有模型都放在一个模型中所需的逻辑将是

  8. ruby-on-rails - 如何使用 ruby​​ 加速大型 CSV 的处理 - 2

    对于一个项目,我需要解析一些非常大的CSV文件。一些条目的内容存储在MySQL数据库中。我正在尝试使用多线程来加快速度,但到目前为止,这只会减慢速度。我解析了一个CSV文件(最大10GB),其中一些记录(20M+记录CSV中的大约5M)需要插入到MySQL数据库中。为了确定需要插入的记录,我们使用Redis服务器和包含正确ID/引用的集合。由于我们在任何给定时间处理大约30个这样的文件,并且存在一些依赖关系,我们将每个文件存储在一个Resque队列中,并让多个服务器处理这些(优先级)队列。简而言之:classWorkerdefself.perform(file)CsvParser.ea

  9. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  10. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

随机推荐