AsyncTask 未传递进度(super.onprogressupdate 是做什么的?)

发布于 2024-12-04 13:40:44 字数 4830 浏览 0 评论 0原文

我正在使用 AsyncTask 从 webview 下载不同的 mp3。当我跟踪下载进度并传递到 onprogress update 时,无论我做什么,它都会收到 0。我尝试过使用双精度数、浮点数和整数。这是我的代码示例:

public class DownloadFile extends AsyncTask<Void, Float, String> {                       

ProgressBar progressBar;
NotificationManager notificationManager;
Notification notification2;            

@Override
protected void onPreExecute() {                
    // configure the intent
    Intent intent = new Intent();
    final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);

    // configure the notification
    notification2 = new Notification(R.drawable.download, "DOWNLOADING: " + filename3, System
            .currentTimeMillis());
    notification2.flags = notification2.flags | Notification.FLAG_ONGOING_EVENT;
    notification2.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.download_progress);
    notification2.contentIntent = pendingIntent;
    notification2.contentView.setTextViewText(R.id.percentage,"hi" );
    notification2.contentView.setTextViewText(R.id.status_text, "DOWNLOADING: " + filename3);
    notification2.contentView.setProgressBar(R.id.status_progress, 100, 0, false);

    getApplicationContext();
    notificationManager = (NotificationManager) getApplicationContext().getSystemService(
            Context.NOTIFICATION_SERVICE);

    notificationManager.notify(2, notification2);
}

@Override
protected String doInBackground(Void... params) {        
    try {

        //set the download URL, a url that points to a file on the internet
        //this is the file to be downloaded
        URL url = songURL2;


        //create the new connection
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        //set up some things on the connection
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);

        //and connect!
        urlConnection.connect();

        //set the path where we want to save the file
        //in this case, going to save it on the root directory of the
        //sd card.
        SDCardRoot = Environment.getExternalStorageDirectory() + "/download/";
        //create a new file, specifying the path, and the filename
        //which we want to save the file as.
        File file = new File(SDCardRoot,filename3);

        //this will be used to write the downloaded data into the file we created
        FileOutputStream fileOutput = new FileOutputStream(file);

        //this will be used in reading the data from the internet
        InputStream inputStream = urlConnection.getInputStream();

        //this is the total size of the file
        Integer totalSize = urlConnection.getContentLength();
        //variable to store total downloaded bytes
        float downloadedSize = 0;

        //create a buffer...
        byte[] buffer = new byte[1024];
        int bufferLength = 0; //used to store a temporary size of the buffer

        //now, read through the input buffer and write the contents to the file
        while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
                //add the data in the buffer to the file in the file output stream (the     file on the sd card
                fileOutput.write(buffer, 0, bufferLength);
                //add up the size so we know how much is downloaded
                downloadedSize += bufferLength;
                //this is where you would do something to report the prgress, like this maybe


                publishProgress((downloadedSize * 100)/totalSize) * 100);


        }
        //close the output stream when done
        fileOutput.close();

       return "Success";



//catch some possible errors...
} catch (MalformedURLException e) {             
        e.printStackTrace();
    return "Failed";
} catch (IOException e) {               
        e.printStackTrace();
           return "Failed";
}
}               

protected void onProgressUpdate(Float... progress) {

    notification2.contentView.setProgressBar(R.id.status_progress, 100, (int)progress[0], false);
    String stringy = progress + "%";
    TextView textytext = (TextView) findViewById(R.id.percentage);
    textytext.setText(stringy);
    notificationManager.notify(2, notification2);           
}

@Override
protected void onPostExecute(String result) {

    notificationManager.cancel(2);          
}
}       

昨天一整天和整个晚上我都在为此苦苦挣扎。 super.onprogressupdate() 与这种情况有什么关系,有人知道解决方案吗?我正在拔头发。

编辑:哦,我正在尝试使用它,以便我可以将此进度发布到自定义通知中的进度栏​​,但您可能可以通过代码看出这一点。

编辑#2:所以我一直在做一些测试,并将进度更改为正确的算术,即

myProgress = (downloadedSize/totalSize) * 100;

然后我说如果 myProgress > 50 然后发布进度(50);

通过这样做,当下载完成一半时,进度条会跳到 50。 然后我滑动变量,它不会将变量数据传递给 onProgressUpdated。

有谁知道为什么硬编码数字有效但变量中的数字无效?

I am using AsyncTask to download different mp3's from webview. When I track my download progress and pass to onprogress update, it receives a 0 no matter what I do. I have tried using Doubles, Floats, and Integers.. here is an example of my code:

public class DownloadFile extends AsyncTask<Void, Float, String> {                       

ProgressBar progressBar;
NotificationManager notificationManager;
Notification notification2;            

@Override
protected void onPreExecute() {                
    // configure the intent
    Intent intent = new Intent();
    final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);

    // configure the notification
    notification2 = new Notification(R.drawable.download, "DOWNLOADING: " + filename3, System
            .currentTimeMillis());
    notification2.flags = notification2.flags | Notification.FLAG_ONGOING_EVENT;
    notification2.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.download_progress);
    notification2.contentIntent = pendingIntent;
    notification2.contentView.setTextViewText(R.id.percentage,"hi" );
    notification2.contentView.setTextViewText(R.id.status_text, "DOWNLOADING: " + filename3);
    notification2.contentView.setProgressBar(R.id.status_progress, 100, 0, false);

    getApplicationContext();
    notificationManager = (NotificationManager) getApplicationContext().getSystemService(
            Context.NOTIFICATION_SERVICE);

    notificationManager.notify(2, notification2);
}

@Override
protected String doInBackground(Void... params) {        
    try {

        //set the download URL, a url that points to a file on the internet
        //this is the file to be downloaded
        URL url = songURL2;


        //create the new connection
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        //set up some things on the connection
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);

        //and connect!
        urlConnection.connect();

        //set the path where we want to save the file
        //in this case, going to save it on the root directory of the
        //sd card.
        SDCardRoot = Environment.getExternalStorageDirectory() + "/download/";
        //create a new file, specifying the path, and the filename
        //which we want to save the file as.
        File file = new File(SDCardRoot,filename3);

        //this will be used to write the downloaded data into the file we created
        FileOutputStream fileOutput = new FileOutputStream(file);

        //this will be used in reading the data from the internet
        InputStream inputStream = urlConnection.getInputStream();

        //this is the total size of the file
        Integer totalSize = urlConnection.getContentLength();
        //variable to store total downloaded bytes
        float downloadedSize = 0;

        //create a buffer...
        byte[] buffer = new byte[1024];
        int bufferLength = 0; //used to store a temporary size of the buffer

        //now, read through the input buffer and write the contents to the file
        while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
                //add the data in the buffer to the file in the file output stream (the     file on the sd card
                fileOutput.write(buffer, 0, bufferLength);
                //add up the size so we know how much is downloaded
                downloadedSize += bufferLength;
                //this is where you would do something to report the prgress, like this maybe


                publishProgress((downloadedSize * 100)/totalSize) * 100);


        }
        //close the output stream when done
        fileOutput.close();

       return "Success";



//catch some possible errors...
} catch (MalformedURLException e) {             
        e.printStackTrace();
    return "Failed";
} catch (IOException e) {               
        e.printStackTrace();
           return "Failed";
}
}               

protected void onProgressUpdate(Float... progress) {

    notification2.contentView.setProgressBar(R.id.status_progress, 100, (int)progress[0], false);
    String stringy = progress + "%";
    TextView textytext = (TextView) findViewById(R.id.percentage);
    textytext.setText(stringy);
    notificationManager.notify(2, notification2);           
}

@Override
protected void onPostExecute(String result) {

    notificationManager.cancel(2);          
}
}       

I was struggling with this all day yesterday and throughout the night. Does super.onprogressupdate() have anything to do with this case, and anyone know a solution? I am pulling my hair out.

EDIT: Oh and I am trying to use it so I can publish this progress to the progress bar I have in my custom notification, but you can probably tell that by the code.

EDIT #2: So I have been doing some testing and I changed my progress to the right arithmetic which is

myProgress = (downloadedSize/totalSize) * 100;

then I said if myProgress > 50 then publishProgress(50);

by doing this the progress bar jumps to 50 when the download is half way done.
then I slip my variable and it doesn't pass the variables data to onProgressUpdated.

Does anyone know why a hard-coded number is working but not a number in a variable??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

自我难过 2024-12-11 13:40:44

记录,记录,记录!记录下这种情况,看看你的输入、输出和中间值在任何给定时刻的结果如何。 (或者在调试器中使用断点,但这是另一个更复杂的故事)。

您确定 getContentLength() 返回您认为返回的内容吗?另外,您还将完成的价值/总价值乘以 100 两次,因此也请检查您的数学。尝试插入一些日志语句,并确保您确实发送了您认为要发送到publishProgress 的值。 (例如,尝试只放置 publishProgress(94.0) 代替,只是为了好玩)。我怀疑问题与服务器未报告内容长度或您的算术关闭有关 - 或者可能与数据足够小以至于您实际上看不到中间值(大多数时间在 wifi/ 3G 用于建立连接和等待延迟;实际数据传输部分通常相当快,尤其是对于较小的文件。

Log, log, log! Log the heck out of this sort of situation and see what your inputs, outputs, and intermediate values are all working out to at any given moment. (Or use breakpoints in the debugger, but that's another more complicated story).

Are you sure getContentLength() is returning what you think it's returning? Also, you're multiplying your done / total value by 100 twice, so check your math there, too. Try inserting a few logging statements and make sure you're actually sending the values you think you're sending to publishProgress. (eg. try just putting publishProgress(94.0) instead, just on a lark). I suspect the problem is something to do with the contentlength not being reported by the server or your arithmetic being off -- or possibly with the data being small enough that you don't actually see the intermediate value (most of the time on wifi/3G is spent establishing the connection and waiting on latency; the actual data transfer portion is usually quite fast, especially for smaller files).

柒七 2024-12-11 13:40:44

所以我做了很多测试,我已经让它完美地与 Android 模拟器一起工作,我所做的是说

 if (myProgress is > 1) && (myProgress > previousProgress) {
previousProgress = myProgress
publishProgress(myProgress);}

奇怪的是,在模拟器中它每次都完美工作,但使用我的手机时进度条却没有进步。起初它出现过一两次,现在任何歌曲都不再出现。而模拟器会处理任何歌曲。为什么这可以在模拟器上运行而不是在真机上运行?

So I have been doing a lot of testing and I have gotten it to work flawlessly with the Android Emulator, what I did was say

 if (myProgress is > 1) && (myProgress > previousProgress) {
previousProgress = myProgress
publishProgress(myProgress);}

The weird thing is that in the emulator it works perfect every time, but using my phone the progressbar doesn't progress. At first it did once or twice and now it doesn't for any song. Whereas the emulator progresses for any song. Why would this work on the emulator and not a real phone?

感情旳空白 2024-12-11 13:40:44

对我来说听起来像是一个java问题,我自己也是java新手。我最近在java中发现,当除以整数类型时,无论如何,你总是会得到一个int值。尝试将totalSize声明为float或(float)在进行除法时将其转换为float

我也注意到

publishProgress((downloadedSize * 100)/totalSize) * 100);

看起来很奇怪,也许你尝试了一些技巧来使代码工作,不应该是downloadSize/totalSize*100吗?

Sound like a java problem to me, I am new to java myself. I recently discovered in java, when divide integer types you will always get a int value, no matter what. try declare totalSize as float or (float) convert it to float when doing division

also I noticed

publishProgress((downloadedSize * 100)/totalSize) * 100);

Looks odd, maybe you tried some hack to make code work, shouldn't it be downloadedSize/totalSize*100 ?

醉城メ夜风 2024-12-11 13:40:44

使用 publishProgress((downloadedSize * 100) /totalSize) );
每次都得到零的原因是因为将 downloadSize 除以totalSize 将结果四舍五入到零,因此结果始终为零。

use publishProgress((downloadedSize * 100) /totalSize) );
reason of getting Zero every time is because of dividing the downloadedSize by totalSize rounds up the result to Zero and hence you the reult is always zero.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文