水平进度条不适用于 Asynctask Android 下载文件?

     2023-05-07     177

关键词:

【中文标题】水平进度条不适用于 Asynctask Android 下载文件?【英文标题】:Horizontal Progress Bar Not Working in Asynctask Android For Download file? 【发布时间】:2014-07-24 17:50:27 【问题描述】:

我正在尝试使用Asynctask 显示水平进度条,但它不适合我。它不是显示百分比进度量。

我把我的 xml 和活动文件以及屏幕截图文件放在这里。

布局xml

<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/progresslayout"
        android:layout_
        android:layout_
        >

        <ImageView
            android:id="@+id/imagepeakmedia"
            android:layout_
            android:layout_
            android:adjustViewBounds="true"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@drawable/peakmedialogo" 
            android:layout_marginTop="100sp"
             />



        <TextView
            android:id="@+id/text"
            android:layout_
            android:layout_
            android:layout_below="@+id/imagepeakmedia"
            android:layout_centerHorizontal="true"
            android:textSize="25sp"
           android:text="" />

        <TextView
            android:id="@+id/textpercentage"
            android:layout_
            android:layout_
            android:layout_below="@+id/imagepeakmedia"
            android:layout_toRightOf="@+id/text"
            android:layout_centerHorizontal="true"
            android:textSize="25sp"
            android:layout_marginLeft="5sp"
            android:text="%" />

        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_
            android:layout_
            android:layout_below="@+id/text"
            style="?android:attr/progressBarStyleHorizontal"

             />

    </RelativeLayout>

TestActivity.java

public class TestActivity extends Activity 


    ProgressDialog progressdialog;

    RelativeLayout progresslayout;
    ProgressBar progressbar;
    TextView textprogressbar;
    TextView textpercentage;
    TextView textdownload;

    boolean progress=true;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_progress);

            progressbar=(ProgressBar)findViewById(R.id.progressBar);
            textprogressbar=(TextView)findViewById(R.id.text);
            textpercentage=(TextView)findViewById(R.id.textpercentage);
            textdownload=(TextView)findViewById(R.id.textdownload);

             new FirstDownloadFileFromURL().execute("http://pr83.webofficeserver.info/img/thumbnails/video/iPhone5.mp4");

    

    public class FirstDownloadFileFromURL extends AsyncTask<String, String, String> 
    

        @SuppressWarnings("deprecation")
        @Override
        protected void onPreExecute() 
        
            // some work
        


        @Override
        protected String doInBackground(String... f_url) 
        

            try 
               

                BufferedOutputStream out = null;

                String originalurl=f_url[0];
                Uri cu = Uri.parse(originalurl);
                File f2= new File("" + cu);
                String  filename=f2.getName();

                Log.i("DownloadFile", "DownloadURL:" +originalurl.replaceAll(" ", "%20"));
                Log.i("DownloadFile", "filename: " + filename);

                String root = Environment.getExternalStorageDirectory().getAbsolutePath();
                new File(root + "/montorwerbung").mkdirs();

                File SmartAR = new File(root + "/montorwerbung", "");
                SmartAR.mkdirs();
                File outputFile = new File(SmartAR, filename);
                FileOutputStream fos = new FileOutputStream(outputFile);
                String url1 = originalurl;
                HttpURLConnection conn = (HttpURLConnection) new URL(url1)
                .openConnection();
                conn.setDoInput(true);
                conn.connect();
                int lenghtOfFile = conn.getContentLength();
                final InputStream in = new BufferedInputStream(conn.getInputStream(), 1024); // buffer size
                // 1KB
                out = new BufferedOutputStream(fos, 1024);
                int b;
                int a=0;
                long total = 0;
                while ((b = in.read()) != -1) 
                   
                    total += b;
                            publishProgress(""+(int)((total*100)/lenghtOfFile));

                        out.write(b);
                
                out.close();
                conn.disconnect();

             catch (final MalformedURLException e) 
                showError("Error : MalformedURLException " + e);        
                e.printStackTrace();
             catch (final IOException e) 
                showError("Error : IOException " + e);          
                e.printStackTrace();
            
            catch (final Exception e) 
                showError("Error : Please Check Your Wifi connection " + e);
                   
            return null;
        


         @Override
    protected void onProgressUpdate(String... progress) 
         Log.d("ANDRO_ASYNC",progress[0]);
         progressbar.setProgress(Integer.parseInt(progress[0]));
    

        @SuppressWarnings("deprecation")
        @Override
        protected void onPostExecute(String file_url) 
        

            // some work

        
      


    public void showError(final String err)
     
            runOnUiThread(new Runnable() 
            
                public void run() 
                

                

            );
     



【问题讨论】:

永远不要更新doInBackground()中的任何用户界面。 【参考方案1】:

您需要为此实现onProgressUpdate(....)

    @Override
    protected void onProgressUpdate(String... progress) 
         Log.d("ANDRO_ASYNC",progress[0]);
         mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    

并通过像这样调用publishProgress(...) 在您的doInBackground(..) 中使用它。

while ((count = input.read(data)) != -1) 
total += count;
publishProgress(""+(int)((total*100)/lenghtOfFile));
output.write(data, 0, count);

【讨论】:

但我没用过progressdiaog 我用过progressbar @AndroidTech 更改进度条 @AndroidTech 为什么在TextView 中显示进度?实现Progress dialog并将样式设置为STYLE_HORIZONTAL它会显示进度 我想创建定制设计,因为它是需要的 @AndroidTech 如果您真的要这样做,那么我还有另一种方法。创建一个单独的Thread 并在其上执行此操作并创建一个Handler,它将更新您的ProressBar 并在您的TextView 中显示进度。【参考方案2】:

您不能从后台线程更新视图,只有 UI 线程可以触摸视图。实际上,您没有异常是很奇怪的。为了从后台线程更新视图,您可以使用Activity.runOnUiThread 方法或Handler 类。但请记住,应在 UI 线程中创建 Handler 以便使用它

【讨论】:

【参考方案3】:

这不是自动的,AsyncTask 有一个你必须实现的 onProgressUpdate 方法

在这里你必须更新你的 ProgressBar

然后你必须调用publishProgress 来调用该方法,你就完成了

请参阅AsyncTask 文档中的示例:

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 
 protected Long doInBackground(URL... urls) 
     int count = urls.length;
     long totalSize = 0;
     for (int i = 0; i < count; i++) 
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
         // Escape early if cancel() is called
         if (isCancelled()) break;
     
     return totalSize;
 

 protected void onProgressUpdate(Integer... progress) 
     setProgressPercent(progress[0]);
 

 protected void onPostExecute(Long result) 
     showDialog("Downloaded " + result + " bytes");
 

他们在这里使用他们的setProgressPercent() 来更新他们想要的任何东西(所以你的 ProgressBar)

【讨论】:

进度条不适用于 zipfile?当程序似乎挂起时如何提供反馈

】进度条不适用于zipfile?当程序似乎挂起时如何提供反馈【英文标题】:ProgressBarnotavailableforzipfile?Howtogivefeedbackwhenprogramseemstohang【发布时间】:2017-02-2404:03:15【问题描述】:我对C#和一般编码相当陌生,因此其中一些可能会以... 查看详情

安卓。你自己的进度条?

...该的事实。告诉我如何实现以下内容:有执行某些操作的AsyncTask有25张如下形式的图片:图片有SheetAnimationxml:<animation-listxmlns:android="http://schemas.andro 查看详情

AsyncTask 和进度条 [重复]

】AsyncTask和进度条[重复]【英文标题】:AsyncTaskandProgressBar[duplicate]【发布时间】:2014-02-0521:14:51【问题描述】:我有发送(多个文本文件)到服务器的应用程序,每个文件发送和获取响应都会更新进度条。一旦所有文件都发送完... 查看详情

Android AsyncTask 没有更新进度条

】AndroidAsyncTask没有更新进度条【英文标题】:AndroidAsyncTaskisnotupdatingProgressBar【发布时间】:2019-01-0822:46:38【问题描述】:您好,我在使用asynctask时遇到问题。我播放了一首歌曲,然后将持续时间更新到进度条。但是当我播放一... 查看详情

带有 ProgressDialog 和进度条的 AsyncTask

】带有ProgressDialog和进度条的AsyncTask【英文标题】:AsyncTaskwithaProgressDialogandProgressBar【发布时间】:2011-10-1219:14:01【问题描述】:我正在尝试使用AsyncTask加载确定长度的文件。我的AsyncTask看起来像这样:protectedvoidonPreExecute()dialog=... 查看详情

ArrayList.add 不适用于 AsyncTask

】ArrayList.add不适用于AsyncTask【英文标题】:ArrayList.addnotworkingwithAsyncTask【发布时间】:2018-12-0907:14:53【问题描述】:我正在使用片段视图在我的Android应用程序中显示ListView。当我手动输入ArrayList时,它工作得很好。但现在我想... 查看详情

在 AsyncTask 中显示进度条

】在AsyncTask中显示进度条【英文标题】:ShowprogressbarinAsyncTask【发布时间】:2016-06-1116:44:27【问题描述】:我想在后台生成表格时显示一个圆形进度条。我在异步任务中的代码:classDoWorkextendsAsyncTask<Void,Void,Void>Contextcontext;pub... 查看详情

使用 AsyncTask 显示一个循环进度条

】使用AsyncTask显示一个循环进度条【英文标题】:UsingAsyncTasktoshowaCircularProgressBar【发布时间】:2013-06-2709:07:27【问题描述】:我是初学者Android程序员。我正在编写一个小型计算器,其中输入了两个否,并在按下总计时添加了两... 查看详情

AsyncTask onPreExecute() 中未显示进度条

】AsyncTaskonPreExecute()中未显示进度条【英文标题】:ProgressBarnotshowinginAsyncTaskonPreExecute()【发布时间】:2014-10-2305:49:59【问题描述】:我目前的项目涉及从服务器下载数据-这大约需要20秒,所以在此期间我想显示一个进度条,以便... 查看详情

Android AsyncTask 重复进程半年

】AndroidAsyncTask重复进程半年【英文标题】:AndroidAsynchTaskrepeatingprocessforhalfanour【发布时间】:2014-09-0203:45:48【问题描述】:我有一个带有进度条的异步任务。我在doInBackground()中需要的是填充我的数据库并使用水平进度条发布它... 查看详情

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?

】自定义对话框片段内的进度条-如何从AsyncTask传递进度?【英文标题】:Progressbarinsidecustomdialogfragment-HowtopassprogressfromanAsyncTask?【发布时间】:2015-06-2602:29:41【问题描述】:我创建了一个自定义对话框片段,在其中我放置了一个... 查看详情

我想在 RxJava 中使用进度条,就像在 AsyncTask 中一样

】我想在RxJava中使用进度条,就像在AsyncTask中一样【英文标题】:IwanttouseaprogressbarwithRxJavalikeyoucanwithAsyncTask【发布时间】:2017-07-0810:09:11【问题描述】:我想在android中用RxJava替换我的AsyncTask。我当前的AsyncTask是这样的:publicclas... 查看详情

如何使用 asynctask 执行数据库操作来实现进度条?

】如何使用asynctask执行数据库操作来实现进度条?【英文标题】:HowIcanperformdatabaseoperationsusingasynctasktoimplementaprogressbar?【发布时间】:2017-02-2616:48:07【问题描述】:我有一个带有列表视图的片段,并通过查询在其中设置数据。... 查看详情

网络通话期间的进度条更新

...这种网络调用的进度以更新我的UI,或者具体来说,我在AsyncTask的doInBackgropun 查看详情

AsyncTask 的 Android 下载文件不适用于 3G 仅适用于 Wi-Fi

】AsyncTask的Android下载文件不适用于3G仅适用于Wi-Fi【英文标题】:AndroidDownloadFilebyAsyncTaskdoesn\'tworkwith3GjustwithWi-Fi【发布时间】:2012-09-1201:57:20【问题描述】:我对此进行了很多搜索,但没有找到答案。我想下载一个文件(提供url... 查看详情

角不适用于android drawable中的环形

...6-2315:57:20【问题描述】:我正在尝试实现一个简单的圆形进度条。它工作正常,但我似乎无法使进度圈的角变圆。我正在尝试实现这样的目标:我的代码:<?xmlversion="1.0"encoding="UTF-8"?><layer 查看详情

我想在进度条文本(变量)中显示处理数据,这在 AsyncTask 类的doingBackground()方法中发生了变化[关闭]

】我想在进度条文本(变量)中显示处理数据,这在AsyncTask类的doingBackground()方法中发生了变化[关闭]【英文标题】:iwanttoshowtheprocessingdatainprogressbartext(variable)whichischangingindoingBackground()methodofanAsyncTaskclass[closed]【发布时间】:... 查看详情

如何在 AsyncTask 的后执行方法中获取对 recyclerveiw 适配器进度条的引用

】如何在AsyncTask的后执行方法中获取对recyclerveiw适配器进度条的引用【英文标题】:HowtogetareferencetorecyclerveiwadapterProgressbarinpostexecutemethodofAsyncTask【发布时间】:2019-07-2521:59:07【问题描述】:这是我要解决的方案。我有一个包含... 查看详情