当前位置: 首页 > 知识库问答 >
问题:

下载带有asyncTask的映像

席安康
2023-03-14

我正在尝试加强我对asyncTask的了解,所以我按照教程下载了一个图像,但我不明白,我得到了一个错误的ArrayOutofBound索引,所以如果有人告诉我原因这里是代码,请告诉我为什么他迭代进度条最大

    public class MainActivity extends AppCompatActivity {
           ProgressBar progessBar;
           ImageView MyImage;
           private final String IMAGE_URL =    "http://www.101apps.co.za/images/headers/101_logo_very_small.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MyImage = findViewById(R.id.imageView);
    ImageButton downloaad = findViewById(R.id.imageButton);
    downloaad.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new downloadFile(MainActivity.this).execute(IMAGE_URL);
        }
    });

}
public class downloadFile extends AsyncTask<String , Integer , String>{
    private  int PROGRESS_BAR_MAX = 100;
    Context context;
    public downloadFile(Context cxt){
         this.context = cxt;
    }
    @Override
    protected String doInBackground(String... strings) {
        String result = "";
        String path = context.getFilesDir() + File.pathSeparator + "downloadFile.png";
        HttpURLConnection httpURLConnection = null;
        try{
            final URL url  = new URL(strings[0]);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            int length = httpURLConnection.getContentLength();
            InputStream IS = (InputStream) url.getContent();
            byte[] imageData = new byte[length];
            Log.d("aho" , "" + length);
            int buffersize = (int) Math.ceil(length/(double)PROGRESS_BAR_MAX);
            int download = 0;
            for(int i = 1 ; i < PROGRESS_BAR_MAX ; i++){
                long read = IS.read(imageData , download , buffersize);
                download += read;
                publishProgress(i);

            }

            BufferedInputStream bufferedReader = new BufferedInputStream(httpURLConnection.getInputStream());
            FileOutputStream Fo = new FileOutputStream(path);
            int data = bufferedReader.read();
            while(data != -1){
                Fo.write(data);
                data = bufferedReader.read();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(httpURLConnection == null){
                httpURLConnection.disconnect();
            }
        }
        publishProgress(PROGRESS_BAR_MAX);
        return path;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progessBar = findViewById(R.id.progressBar);
        progessBar.setMax(PROGRESS_BAR_MAX);


    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progessBar.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        if(s != null) {
            progessBar.setVisibility(View.INVISIBLE);
            Bitmap bitmap = BitmapFactory.decodeFile(s);
            MyImage.setImageBitmap(bitmap);

        }
    }
}
}

下面是堆栈跟踪01-20 03:37:40.607 407 5-4096/com.gamecodeschool.bodybuilder E/AndroidRuntime:致命异常:AsyncTask#1进程:com.gamecodeschool.bodybuilder,PID:4075 java.lang.RuntimeException:在Android.os.AsyncTask$3执行doInBackground()时出错。done(AsyncTask.java:353)在java.util.concurrent.FutureTask.FinishCompletion(futureTask.java:383)在FferedSource.java:368)在com.gamecodeschool.bodybuilder.MainActivity$DownloadFile.DoinBackgroun(mainActivity.java:66)在com.gamecodeschool.bodybuilder.MainActivity$DownloadFile.DoinBackgroun(mainActivity.java:45)在android.os.AsyncTask$2。调用(asynctask.java:333)在java.util.concurrent.FutureTask.Run(FutureTask.java:266)

共有1个答案

龚安民
2023-03-14

这是因为您的read循环是在进度计数上循环,而不是在下载的资源大小上循环。循环访问资源的大小(确保检查读取错误),并根据读取的数量与总长度计算进度。

 类似资料:
  • 在处理上述异常时,又发生了一个异常: 回溯(最近一次调用):文件“/users/macintosh/pycharmprojects/claculatorer/bucky.py”,第9行,在download_web_image(“https://upload.wikimedia.org/wikipedia/commons/b/b4/jpeg_example_jpg_rip_100.jpg”)中;文件

  • 我正在做一个简单的天气应用程序,我有一个问题,通过AsyncTask读取变量。我是andorid编程的初学者,所以我要求理解。因此,我想将变量“latitude”和“longitude”从place picker中选择到asynctask.execute(“latitude”,“longitude”)中,并刷新屏幕以显示新位置的天气。但我注意到,当我在代码中不是通过变量(例如asynctask.e

  • 问题内容: 我正在尝试使用asyncTask下载文件,但无法正常工作,没有错误消息或什么都没有,只是不下载文件…我尝试了所有操作,但似乎并没有输入…任何人都知道可以是问题吗?我在手机上测试过,网址也可以。 问题答案: 我只运行了您的代码,它对我来说很好用。该图像已下载到sdcard。 请注意,请确保在AndroidManifest.xml中设置了以下权限: 这是我得到的日志(请注意,我添加了):

  • 我正在制作这个应用程序,用户可以有一张个人资料图片(但只有一张图片每人)。我得到了所有的设置,但当图片是2MB+时,它需要一些时间来加载,实际上我只需要图片是50KB左右(只有图片的小显示,最大40像素)。我做了一些代码将图像直接放入实时数据库(转换为画布并使它们成为一个7KB的base64字符串)。但是,这并不是真的干净,最好使用Firebase存储。 自从新的更新3.3.0以来,您可以使用pu

  • 我在我的应用程序中使用了XSD中的gml(3.1.1)XSDs。我想下载版本3.1.1中的所有gml XSD,例如zip文件。换句话说:基本xsd在这里,我想下载这个xsd,所有的导入都在zip文件或类似zip文件的东西中。是否有任何应用程序支持这一点?我找到了这个下载器,但它对我不起作用(我认为这个应用程序不支持gml.xsd3.1.1中出现的导入中的相对路径)。有什么想法吗?

  • 本文向大家介绍Android带进度条的下载图片示例(AsyncTask异步任务),包括了Android带进度条的下载图片示例(AsyncTask异步任务)的使用技巧和注意事项,需要的朋友参考一下 为什么要用异步任务? 在Android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗