【问题标题】:AsyncTask get a wrong String parameterAsyncTask 得到错误的字符串参数
【发布时间】:2014-04-16 10:22:39
【问题描述】:

我正在尝试在 asyncTask 中加载位图,在 onClick 中我将执行 myAsyncTask 并获取位图作为结果。我被 NullPointerException 困住,因为我放入 myAsyncTack 的 String 参数被解码错误(参见 logcat 屏幕截图,第一行是 String data[position] 的 log.d,第二行来自 myAsyncTask 解码方法)。在我的代码中,我需要在后台打开大量图像,如何使用 myAsyncTask 正确完成?

执行:

        Log.d("Files", "DATA: " + data[position]);
        try{
            ImageView mImg = (ImageView) vi.findViewById(R.id.imageView);
            BitmapTask btmt = new BitmapTask();
            btmt.execute(data[position]);
            mImg.setImageBitmap(btmt.get());
        } catch (Exception e){
            e.printStackTrace();
        }


        return vi;

异步:

public class BitmapTask extends AsyncTask {

        @Override
        protected Bitmap doInBackground(String... bmt) {
            Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/MANUAL/workflow/" + bmt);
            int targetWidth  = bm.getWidth() / 1;
            int targetHeight = bm.getHeight() / 1;

            Bitmap size = Bitmap.createBitmap(bm, 0, 0, targetWidth, targetHeight, matrix(), true);
            return size;
        }

        @Override
        protected void onPostExecute(Bitmap result) {

        }

    }

日志猫:

【问题讨论】:

    标签: java android string bitmap android-asynctask


    【解决方案1】:

    改变这个:

    Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/MANUAL/workflow/" + bmt);
    

    到这里:

    Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/MANUAL/workflow/" + bmt[0]);
    

    你必须得到String... bmt字符串数组的第一个元素。

    【讨论】:

    • 谢谢,解决了一个问题,但我的图像加载时间仍然很慢,我的代码中还有其他问题吗?
    • 不,但我会建议尝试使用UrlImageViewHelper 库来快速加载图像。而且,很高兴为您提供帮助。享受编码。
    【解决方案2】:

    您应该使用onPostExecute 方法将位图设置为ImageView

    任务完成后会在UI线程上执行。

    试试这样的:

    public class BitmapTask extends AsyncTask {
    
        private ImageView imageView;
    
        @Override
        protected Bitmap doInBackground(String... bmt) {
            Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/MANUAL/workflow/" + bmt);
            int targetWidth  = bm.getWidth() / 1;
            int targetHeight = bm.getHeight() / 1;
    
            Bitmap size = Bitmap.createBitmap(bm, 0, 0, targetWidth, targetHeight, matrix(), true);
            return size;
        }
    
        @Override
        protected void onPostExecute(Bitmap result) {
            this.imageView.setImageBitmap(result);
        }
    
        public void setImageView(ImageView imageView){
            this.imageView = imageView;
        }
    
    
    }
    

    Log.d("Files", "DATA: " + data[position]);
        try{
            ImageView mImg = (ImageView) vi.findViewById(R.id.imageView);
            BitmapTask btmt = new BitmapTask();
            btmt.setImageView(mImg);
            btmt.execute(data[position]);
        } catch (Exception e){
            e.printStackTrace();
        }
    
    
        return vi;
    

    【讨论】:

      【解决方案3】:

      位于 Environment.getExternalStorageDirectory() + "/MANUAL/workflow/" + bmt 的文件不存在,并在 BitmapTask 中抛出 FileNotFoundexcption。用try catch包围以避免崩溃:)

      【讨论】:

      • 在logcat你可以看到文件没问题
      【解决方案4】:

      使用

      public class BitmapTask extends AsyncTask<Check params> { }

      检查[参数]

      根据需要使用&lt;String, Integer, Void&gt;

      异步任务使用的三种类型如下:

      Params, the type of the parameters sent to the task upon execution.
      Progress, the type of the progress units published during the background computation.
      Result, the type of the result of the background computation.
      

      同时添加

      String fileName = bmt[0];
      Environment.getExternalStorageDirectory() + "/MANUAL/workflow/" + fileName;
      

      Link

      【讨论】:

      • 检查底部的添加。你没有得到参数
      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 2013-09-02
      • 1970-01-01
      相关资源
      最近更新 更多