尝试在列表视图中显示每个文件上传的进度时 UI 卡住

     2023-04-19     115

关键词:

【中文标题】尝试在列表视图中显示每个文件上传的进度时 UI 卡住【英文标题】:UI stuck while trying to show progress of each file upload in listview 【发布时间】:2018-04-06 22:07:51 【问题描述】:

我试图在 ListView 中将多个文件上传到 Box.com 时显示它们的进度。我正在使用从这个链接https://github.com/lzyzsd/CircleProgress 找到的甜甜圈进度条来显示列表中每个项目的进度。

但是,我在上传时似乎无法更新 UI。 UI 卡住了,甚至没有响应用户的点击。每个项目的进度条从 0% 开始,只有在每次上传完成后才会变为 100%。由于 UI 卡住,中间的所有百分比均未显示。

我目前正在为列表视图中的每个项目使用自定义视图。我这样做是因为我希望每个视图都实现一个进度监听器。然后我将每个视图添加到各自的异步任务中,并从那里更新进度。

以下是我的代码:

我用于 ListView 的适配器

public class SurveyListAdapter extends BaseAdapter 

private LayoutInflater inflater;
private LinkedList<File> files;
private static LinkedList<String> savedIDs;
private ViewHolder holder;
private BoxApiFile mFileApi;
private HomeActivity homeActivity;
private int [] progress;
private int mScrollState = AbsListView.OnScrollListener.SCROLL_STATE_IDLE;
private ListView listView;
private File file;

public class ViewHolder 
    TextView fileIDTextView;
    TextView dateModifiedTextView;
    DonutProgress fileUploadProgress;
    CustomSurveyView customSurveyView;
    UploadToBoxTask uploadTask;


public SurveyListAdapter(HomeActivity homeActivity, LinkedList<File> files, ListView listView) 
    this.homeActivity = homeActivity;
    inflater = LayoutInflater.from(homeActivity);
    this.files = files;
    savedIDs = new LinkedList<>();
    progress = new int [files.size()];
    this.listView = listView;


public int getCount() 
    return files.size();


public File getItem(int position) 
    return files.get(position);


public long getItemId(int position) 
    return position;


public View getView(int position, View convertView, ViewGroup parent) 
    file = files.get(position);
    holder = null;
    if(convertView == null) 
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.survey_list_view, null);
        holder.customSurveyView = (CustomSurveyView) convertView.findViewById(R.id.customSurveyView);
        holder.fileUploadProgress = holder.customSurveyView.getDonutProgress();
        holder.fileIDTextView = holder.customSurveyView.getFileIDTextView();
        holder.dateModifiedTextView = holder.customSurveyView.getDateModifiedTextView();
        holder.uploadTask = new UploadToBoxTask(this, holder.customSurveyView, file);
        convertView.setTag(holder);
     else 
        holder = (ViewHolder) convertView.getTag();
    
    String fileName = file.getName();
    String fileShouldStartWith = HomeActivity.FILE_SHOULD_START_WITH;
    String fileShouldEndWith = HomeActivity.FILE_SHOULD_END_WITH;

    String ID = fileName.substring(fileShouldStartWith.length(), fileName.length() - fileShouldEndWith.length()).trim();
    savedIDs.add(ID);

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy   hh:mm a");
    String lastDateModified = sdf.format(file.lastModified());

    holder.fileIDTextView.setText("Subject ID " + ID);
    holder.dateModifiedTextView.setText(lastDateModified);

    return convertView;


public View getViewByPosition(int pos) 
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition ) 
        return listView.getAdapter().getView(pos, null, listView);
     else 
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    


public static LinkedList<String> getSavedIDs() 
    return savedIDs;


public void syncWithBox(BoxApiFile mFileApi)
    this.mFileApi = mFileApi;

    ExecutorService executor = Executors.newSingleThreadExecutor();
    for (int i = 0; i < files.size(); i++) 
        ViewHolder holder = (ViewHolder) getViewByPosition(i).getTag();
        holder.fileUploadProgress.setVisibility(View.VISIBLE);
        holder.uploadTask.executeOnExecutor(executor);

    executor.shutdown();

    while (!executor.isTerminated())  

    System.out.println("Finished uploading");


private class UploadToBoxTask extends AsyncTask<Void, Integer, Void>

    SurveyListAdapter surveyListAdapter;
    BoxUploadProgressListener progressListener;
    File uploadFile;

    public UploadToBoxTask(SurveyListAdapter surveyListAdapter, BoxUploadProgressListener progressListener, File uploadFile)
        this.surveyListAdapter = surveyListAdapter;
        this.progressListener = progressListener;
        this.uploadFile = uploadFile;
    

    @Override
    protected Void doInBackground(Void... params) 
        try 
            final BoxRequestsFile.UploadFile request = mFileApi.getUploadRequest(uploadFile, BoxConstants.ROOT_FOLDER_ID);
            request.setProgressListener(new ProgressListener() 
                @Override
                public void onProgressChanged(long numBytes, long totalBytes) 
                    publishProgress((int) (100 * (numBytes/totalBytes)));
                
            );
            final BoxFile uploadFileInfo = request.send();
            showToast("Uploaded " + uploadFileInfo.getName());
            //loadRootFolder();
         catch (BoxException e) 
            BoxError error = e.getAsBoxError();
            if (error != null && error.getStatus() == HttpURLConnection.HTTP_CONFLICT) 
                ArrayList<BoxEntity> conflicts = error.getContextInfo().getConflicts();
                if (conflicts != null && conflicts.size() == 1 && conflicts.get(0) instanceof BoxFile) 
                    //uploadNewVersion((BoxFile) conflicts.get(0), position, adapter);
                    publishProgress(100);
                    return null;
                
            
            showToast("Upload failed");
            e.printStackTrace();
        
        return null;
    

    @Override
    protected void onProgressUpdate(Integer... integers)
        progressListener.onProgressUpdate(integers[0]);
        showToast(String.valueOf(integers[0]));
    

    @Override
    protected void onPostExecute(Void param)

    


我创建的自定义视图:

public class CustomSurveyView extends RelativeLayout  implements BoxUploadProgressListener
View rootView;
LinearLayout linearLayout;
TextView fileIDTextView;
TextView dateModifiedTextView;
DonutProgress donutProgress;

public CustomSurveyView(Context context) 
    super(context);
    init(context);


public CustomSurveyView(Context context, AttributeSet attrs) 
    super(context, attrs);
    init(context);


private void init(Context context) 
    rootView = inflate(context, R.layout.custom_survey_view, this);
    linearLayout = rootView.findViewById(R.id.fileInfoLayout);
    fileIDTextView = rootView.findViewById(R.id.fileIDTextView);
    dateModifiedTextView = rootView.findViewById(R.id.dateModifiedTextView);
    donutProgress = rootView.findViewById(R.id.fileUploadProgressBar);


@Override
public void onProgressUpdate(int progress) 
    donutProgress.setVisibility(View.VISIBLE);
    ObjectAnimator anim = ObjectAnimator.ofInt(donutProgress, "progress", donutProgress.getProgress(), progress);
    donutProgress.setProgress(progress);
    anim.setInterpolator(new DecelerateInterpolator());
    anim.setDuration(500);
    anim.start();
    invalidate();


public LinearLayout getLinearLayout() 
    return linearLayout;


public TextView getFileIDTextView() 
    return fileIDTextView;


public TextView getDateModifiedTextView() 
    return dateModifiedTextView;


public DonutProgress getDonutProgress() 
    return donutProgress;


我创建的进度监听接口

public interface BoxUploadProgressListener 
    void onProgressUpdate(int progress);

这就是我的布局的样子

请帮助正确更新每次上传进度的 UI。我已经在这两天了。

【问题讨论】:

【参考方案1】:

可能的原因:

    避免从异步任务更改 Ui

    避免与每个持有者实例一起添加新线程,这会增加 RAM 消耗,因为应用程序没有响应。

在主线程中创建界面并更新 UI。

【讨论】:

那不是问题。不过感谢您的帮助。【参考方案2】:

我发现了问题。它是我在执行程序之后放置的while循环。它一直运行直到所有任务完成。

【讨论】:

如何在使用数据加载列表视图之前在具有列表视图的活动中显示进度条(圆圈)

...ctivity.OnItemClick中有一个ListView,我调用了一个网络服务并尝试获取数据。之后 查看详情

Swift UI:当视图中显示空列表时,如何显示错误消息?

】SwiftUI:当视图中显示空列表时,如何显示错误消息?【英文标题】:SwiftUI:HowdoIdisplayanerrormessagewhenanemptyListisdisplayedinaView?【发布时间】:2021-04-2520:06:35【问题描述】:我有一组Terms,按字母顺序分组。下面的SwiftUI代码将集合... 查看详情

文件上传进度的通知观察者模式仅在文件很大时才有效 - swift?

...:07【问题描述】:我有一个将图像上传到远程服务器的单视图应用程序。当用户提交上传时,我使用第二个视图控制器显示为自定义弹出窗口并显示文件上传进度。上传 查看详情

Ant设计文件上传中使用customRequest

...显示文件上传的上传进度时遇到问题。我使用的文件上传视图是“图片卡”。HTML<Uploadaccept="image/*"customRequest=uploadImageonChang 查看详情

AFNetworking 显示上传进度

...关于使用AFNetworking和显示上传进度的问题。场景:从表格视图中,用户可以单击一行并进入详细视图。在详细视图中,用户可以上传五张图片。如果用户上传一张图片,上传进度视图将显示在详细视图的顶部。相当简单。:)现在... 查看详情

单击ListViewItem时Android加载片段

...licked【发布时间】:2016-02-2601:45:18【问题描述】:我正在尝试在列表视图中单击列表视图项时加载片段。我在滑动选项卡布局中有几个选项卡,每个选项卡都包含一个包含多个项目的列表视图。当更改选项卡时,列表中的FIRT项xi... 查看详情

使用 laravel 在电子邮件中显示动态视图

...de.php当我显示模板预览时,它显示为必须显示,但是当我尝试使用此模板发送电子邮件时, 查看详情

中止多文件上传 AJAX 请求

...equest【发布时间】:2015-01-0222:44:45【问题描述】:我正在尝试使用进度条中止多文件上传,显示过程状态。我想要实现的是在中止按钮单击时完全中止多个文件上传;停止进度条并清除在最初触发的多文件上传过程中可能已上传... 查看详情

如何在家庭活动android上显示进度对话框?

...时间】:2020-11-0313:50:35【问题描述】:我有一个底部导航视图,这个视图有3个项目3个不同的片段。在我的一个片段中,我将视频文件上传到服务器。我的问题是:当上传开始时,我想显示我的主要活动的上传进度,比如instagram... 查看详情

使用 AsyncTask 显示输入流文件读取进度

...述】:我想显示正在读取的文件的进度,并将其放入数组列表中。为此,在应用程序在列表视图中向用户显示数组列表之前,我想显示通过AsyncTask读取了多少文件。目前短暂显示白屏。正在读取的文件包含大约20000行。AsyncTask 查看详情

遍历选项卡列表并使用 if 语句显示不同的视图

...间】:2021-04-1619:29:39【问题描述】:嗨,所以目前我正在尝试迭代构建选项卡和选项卡面板以显示它的信息,但我无法获得我想要显示的内容。我有一个名称列表,每个名称创建一个选项卡和一个选项卡面板(Tabse.g)(Tabs:TabA,TabB,Ta 查看详情

如何在每个视图分页器中显示json一个[关闭]

...新的视图寻呼机时。我可以在每个视图寻呼机上显示一个列表项,在下一个视图寻呼机上滑动显示另一个项目。答案我已经创建并上传了一个示例android项目给GitHub以解决您的问题。Usethislink(https://github.com/anupa91/ViewPagerExample2) 查看详情

视图不在窗口层次结构错误中

...:17【问题描述】:我遇到了一个错误,我的视图控制器在尝试上传文件时被关闭。基本上,问题在于我有一个加载网站的WKWebView。在这个网站中,有一个需要图片的“上传文件”按钮。然后屏幕继续显示使用相机/照片库的选项... 查看详情

ios在内存中保持视图

...将项目保存在内存中?与您在iPhone音乐应用程序上的播放列表和播放器视图之间切换的方式 查看详情

尝试通过列表视图显示数据时应用程序崩溃

】尝试通过列表视图显示数据时应用程序崩溃【英文标题】:AppgetcrashedwhentryingtodisplayDatathroughlistview【发布时间】:2019-05-0817:10:57【问题描述】:我正在尝试使用retrofit2获取数据并使用作为自定义适配器参数传递的列表显示这些... 查看详情

在材质 UI 中动态更改选项卡内容

...(材料ui)的div。它有两个选项卡。其中一个选项卡具有列表视图(material-ui)。我想要一种行为,这样当我单击列表视图的任何列表项时,我的选项卡内容应该淡出(或隐藏或更改)列表视图并为我的选项卡提供另一个 查看详情

如何在列表视图项中显示和隐藏视图?

...时,当前必须消失,而上一个必须可见。在适配器类中我尝试了很多东西,但 查看详情

进度可见性在列表视图页脚中不起作用

】进度可见性在列表视图页脚中不起作用【英文标题】:Progressvisibilitynotworkinginlistviewfooter【发布时间】:2015-10-2112:57:52【问题描述】:我在列表视图中使用分页,当用户向下滚动到列表视图末尾时,我在列表视图页脚中显示进... 查看详情