Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >试图获取下载文件的大小,但得到一个错误

试图获取下载文件的大小,但得到一个错误
EN

Stack Overflow用户
提问于 2011-03-12 01:39:33
回答 2查看 1.9K关注 0票数 1
代码语言:javascript
运行
AI代码解释
复制
private class DownloadLargeFileTask extends AsyncTask<Void, Void, Void> 
{
    private final ProgressDialog dialog;

    public DownloadLargeFileTask(ProgressDialog dialog) {
         this.dialog = dialog;
    }

    protected void onPreExecute() {
        dialog.show();
    }


    protected void onPostExecute(Void unused) {
        dialog.dismiss();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        download();
        return null;
    }
}

private void download ()
{
    try 
    {
        long startTime = System.currentTimeMillis();

        URL u = new URL("http://mds.podfm.ru/188/download/040_Sergejj_Palijj_-_Karantin_CHast_2.mp3");
        HttpURLConnection c = (HttpURLConnection) u.openConnection();

        c.setRequestMethod("GET");
        c.setDoOutput(true);
        c.connect();
        FileOutputStream f = new FileOutputStream(new File("/sdcard/","my.mp3"));

        InputStream in = c.getInputStream();

        byte[] buffer = new byte[1024];
        int len1 = 0;
        int downloadedSize = 0;
        while ( (len1 = in.read(buffer)) != -1 ) 
        {
          f.write(buffer,0, len1);
          downloadedSize += len1; 
          ReturnDownloadedBytes(downloadedSize);
        }
        f.close();
        Log.d("ImageManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec");
    }
    catch (IOException e)
    {
        Log.d("ImageManager", "Error" + ((System.currentTimeMillis()) / 1000) + e + " sec");
    }
}

private void ReturnDownloadedBytes(int size)
{
    text.setText(String.valueOf(size));

}

错误说明:只有创建视图层次结构的原始线程才能触摸其视图。我认为这意味着我从一个地方创建文本视图,并试图从另一个(AsyncTask)获得访问权,但是如何获得它呢?谢谢

编辑

这是所有密码。但是,即使我发送publishProgress(downloadedSize) int value = 10,它也会在text.setText(String.valueOf(progress));中输出不同的值,比如[Ljava.lang.float;@43ed62f78

代码语言:javascript
运行
AI代码解释
复制
public class list extends Activity {

private TextView text;



@Override
public void onCreate(Bundle icicle)
{
    super.onCreate(icicle);
    setContentView(R.layout.main);

    text = (TextView)findViewById(R.id.result);
}

public void selfDestruct(View view) {

    ProgressDialog dialog = new ProgressDialog(this);
    dialog.setMessage("????????. ?????...");
    new DownloadLargeFileTask(dialog).execute();

}


private class DownloadLargeFileTask extends AsyncTask<Void, Integer, Void> 
{
    private final ProgressDialog dialog;

    public DownloadLargeFileTask(ProgressDialog dialog) {
         this.dialog = dialog;
    }

    protected void onPreExecute() {
        dialog.show();
    }


    protected void onPostExecute(Void unused) {
        dialog.dismiss();
    }

    protected void onProgressUpdate(Integer...progress) {

        text.setText(String.valueOf(progress));

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        try 
        {
            long startTime = System.currentTimeMillis();

            URL u = new URL("http://mds.podfm.ru/188/download/040_Sergejj_Palijj_-_Karantin_CHast_2.mp3");
            HttpURLConnection c = (HttpURLConnection) u.openConnection();

            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            FileOutputStream f = new FileOutputStream(new File("/sdcard/","my.mp3"));

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            int downloadedSize = 10;
            while ( (len1 = in.read(buffer)) != -1 ) 
            {
              f.write(buffer,0, len1);
              //downloadedSize += len1; 
              **publishProgress(downloadedSize);**
            }
            f.close();
            Log.d("ImageManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec");
        }
        catch (IOException e)
        {
            Log.d("ImageManager", "Error" + ((System.currentTimeMillis()) / 1000) + e + " sec");
        }
        return null;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-12 05:50:23

你对错误的评估是正确的。我假设text是在Activity中定义的TextView对象,因此它是在UI线程中创建的。在doInBackground()中运行的代码在单独的线程中运行。只有UI线程才能执行UI元素的更新,所以当您试图调用setText时,会得到您报告的错误消息。

Abhinav在如何解决这个问题方面也是正确的,因为AsyncTask有一个方法,您可以调用该方法将更新从后台线程发送到UI线程:publishProgress,它调用onProgressUpdate()

将此方法添加到AsyncTask

代码语言:javascript
运行
AI代码解释
复制
@Override
protected void onProgressUpdate(Integer... integer){
    text.setText(integer[0].toString());
}

并在while中更改download()循环

代码语言:javascript
运行
AI代码解释
复制
while ( (len1 = in.read(buffer)) != -1 ) 
{
  f.write(buffer,0, len1);
  downloadedSize += len1; 
  publishProgress(downloadedSize);
}
票数 2
EN

Stack Overflow用户

发布于 2011-03-12 01:50:03

您可以通过将进度发布到UI线程来更改UI。从publishProgress从doInBackground打电话。这将从您可以更新UI的地方调用onProgressUpdate在您的AsyncTask中。

您必须在您的onProgressUpdate中定义AsyncTask。http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5281740

复制
相关文章
C得到文件的大小
先用fopen打开文件,然后把文件指针指向文件尾. 再用ftell获得文件指针当前位置(即文件长度). 源代码: #include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std; int main() { FILE* fp = NULL; int nFileLen = 0; fp = fopen("c:/Test.txt", "rb"); if (fp == NULL) { cout << "can'
cloudskyme
2018/03/20
1.2K0
fstream 获取文件大小_c++获取文件大小
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/04
6.4K0
得到目录大小
本文由来源 21aspnet,由 system_mush 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2020/07/21
9710
python获取文件大小
python获取文件大小 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- import os # 字节bytes转化kb\m\g def formatSize(bytes): try: bytes = float(bytes) kb = bytes / 1024 except: print("传入的字节格式不对") return "Error" if kb >= 102
机器学习和大数据挖掘
2019/07/02
7.2K0
PG获取文件大小的方式
通过\dt+可以得到该表大小。该元命令会转换成SQL语句去执行,实际上是通过pg_table_size函数进行获取。该函数调用calulate_table_size(rel)其中rel为表的描述结构Relation。通过这个方式计算表大小包括fsm、vm文件大小,如果有toast索引,还包括toast表大小。那么具体获取文件大小的方式是什么呢?看calculate_relation_size函数:最终通过stat函数来获取,这个得到的是文件大小,而不是占用磁盘大小。同样,对于toast索引也是通过这种方式计算得到。
yzsDBA
2021/01/05
1.7K0
word在试图打开文件时遇到错误的解决办法
取消勾选第一个选项“为来自Internet的文件启用受保护的视图”,点击确定后退出,然后重新打开文件
全栈程序员站长
2022/09/01
2.7K0
word在试图打开文件时遇到错误的解决办法
fseek、ftell 获取文件大小
fseek可以移动FILE结构体中指向文件位置的指针指向,其第三个参数可以让我们非常灵活的将指针移动要任意自己需要的位置。而ftell则可以获取当前指针位置,返回一个long大小的数值,我们可以使用fseek将指向文件的指针移动到文件末尾,然后使用ftell取当前指针的位置,就可以得到一个文件的大小。具体实现如下:
我与梦想有个约会
2023/10/20
3180
获取文件的大小(fseek和ftell函数)
FILE *fp = fopen("C:\\Users\\Administrator\\Desktop\\hello.txt", "r");
用户7886150
2021/02/13
1.2K0
word在试图打开文件时遇到错误,解决办法
取消勾选第一个选项“为来自Internet的文件启用受保护的视图”,点击确定后推出,然后重新打开文件
全栈程序员站长
2022/08/12
2K0
word在试图打开文件时遇到错误,解决办法
Word 在试图打开文件时遇到错误 解决办法
从网上下了个word文档,发现打开时提示文件打开遇到错误,提示的解决办法都无效,发到其他电脑上发现又能正常打开,于是确定是本机word设置有问题
全栈程序员站长
2022/08/11
1.6K0
Word 在试图打开文件时遇到错误 解决办法
VB获取文件大小的方法代码分享
' Copyright (c) 2009, reusablecode.blogspot.com; some rights reserved.
大师级码师
2022/11/06
1.4K0
OC中根据文件路径获取文件大小
NSString * cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
用户1451823
2018/09/13
2.7K0
C++通过文件指针获取文件大小
对于读取本地文件,很多时候需要预先知道本地文件的大小在进行读取。网上给出的方案是移动文件指针,计算文件头和文件尾的偏移,计算出文件的大小。但是我总觉得这样做可能会与读取文件一样消耗性能,为了解决这个问题,我写了如下例子验证了一下。
charlee44
2021/11/02
2.9K0
java如何获取一个对象的大小
When---什么时候需要知道对象的内存大小 在内存足够用的情况下我们是不需要考虑java中一个对象所占内存大小的。但当一个系统的内存有限,或者某块程序代码允许使用的内存大小有限制,又或者设计一个缓存机制,当存储对象内存超过固定值之后写入磁盘做持久化等等,总之我们希望像写C一样,java也能有方法实现获取对象占用内存的大小。 How---java怎样获取对象所占内存大小 在回答这个问题之前,我们需要先了解java的基础数据类型所占内存大小。 数据类型 所占空间(byte) byte     1
SecondWorld
2018/03/14
8.3K1
office xls 文件已损坏 无法打开 word在试图打开文件时遇到错误
转自:http://windyli.blog.51cto.com/1300305/326491
全栈程序员站长
2022/09/01
2.6K0
遇到“word在试图打开文件时遇到错误”怎么办?
1.打开文件遇到的错误提示“word在试图打开文件时遇到错误” 2.关闭这个提示窗口,打开左上角的文件按钮。 3.点击最下面的选项按钮,进入选项对话框, 4.点击左侧的信任中心,然后选择右侧的信任中心设置。 5.进入信任中心点击左侧的受保护试图选项卡,默认是三个选项都被选中。 6.取消勾选第一个选项“为来自internet的文件启用受保护的试图”,点击确认后退出,然后重新打开文件,看看是不是有效果了!
全栈程序员站长
2022/06/30
5.8K0
CFile::GetStatus 获取文件大小有问题
这个代码是在VS2015上, 文件大小大于2GB, fileStatus.m_size获取到的文件大小结果不对, GetStatus还返回执行成功
ClearSeve
2022/02/11
1.2K0
CFile::GetStatus 获取文件大小有问题
获取视频文件大小和时长
应用场景: m3u8视频爬取,获取m3u8视频链接不知道数量,可以获得时长 while True 死循环判断时长break打断 while 时长<指定时常
诡途
2022/05/09
2.5K0
word输入矩阵卡死,导致word在试图打开文件时遇到错误
问题: 今天用office word 2019输入一个矩阵的时候,突然卡死了。强制关闭了word。再打开就变成这样了。
全栈程序员站长
2022/08/31
1.2K0
word在试图打开文件时遇到错误,检查稳定或驱动器文件权限
我看很多人也是这问题,这种方案就可以解决。但我的是根本就没有“解除锁定”这一选项。
全栈程序员站长
2022/08/25
1.8K0
word在试图打开文件时遇到错误,检查稳定或驱动器文件权限

相似问题

试图运行NSTask但得到一个错误

24

试图安装FOSUserBundle但得到错误

14

Rails试图使用foreach获取数据,但得到了错误

13

试图创建一个proc,但得到了错误

20

试图导入keras,但得到了一个错误

36
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文