【问题标题】:problem is in ASyncTask class in Android问题出在 Android 的 ASyncTask 类中
【发布时间】:2010-12-10 11:32:44
【问题描述】:

基本上我正在从文件中读取图像字节我有一个循环,它必须从文件中读取近 20 个图像,在这个循环中,我制作了我的类的对象,它扩展了 ASyncTask 类,我正在读取字节并在画布上绘图doItBackground() 方法并在onPostExecute() 方法上设置我的图像。所以基本上异步20个线程在后台开始执行。现在的问题是它没有显示任何图像。

有人知道如何处理多个 AsyncTask 类吗?这是我的代码。

    @Override
    protected Void doInBackground(Void... params) 
    {
//      Log.i("start background thread", "start background thread");
        Set<Integer> keys;
        keys = iTileListOffsets.keySet();
        boolean found = false;
        Object key[] = keys.toArray();
        int k = 0;

        for (int i=0; i < key.length && found==false ; i++)
        {               
            k = (Integer) key[i];
            MapTileHeader tileHeader = iTileListOffsets.get(k);
            if (tileHeader.equalsWith(mapTile.getiMapTileHeader()) )
            {                   
                found = true; 
            }
        }

        if(found)
        {           
            try 
            {   
                synchronized (MapMaker.getSingletonObject()) 
                {
                    fc.position(0);                     
                    input.skipBytes(k);                         
                    int tSizeOfTile = input.readInt();              
                    mapTile.loadTileWithFileHeader(input, tSizeOfTile, headerBytesArray);
                }

                mapMaker.getBufferedTilesDataList().add(mapTile);                       
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            byte imageTile[] = mapTile.getImageTilesBytes();             //bufferedTile.getImageTilesBytes();                   

            if(mapTile.getImageTilesBytes() != null)
            {                       
                try
                {
                    Bitmap tileBitmap = BitmapFactory.decodeByteArray(imageTile, 0, imageTile.length);
                    canvas.drawBitmap(tileBitmap, rect.left, rect.top, null);
                    tileBitmap = null;
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }                   
            }
        }
//      Log.i("ENDDDD background thread", "ENDDD background thread");
        return null;
    }

    @Override
    protected void onPostExecute(Void result)
    {
        // TODO Auto-generated method stub
        super.onPostExecute(result);        
        Log.i("start POSTECEXCUTE thread", "start POSTECEXCUTE thread");

        MyRect mapRect = aBufferArea.GetScreenRectangle(buffer, aScrnArea); 
        Bitmap smallBitmap = Bitmap.createBitmap(bitmap, mapRect.left, mapRect.top, mapRect.width, mapRect.height);         
        image.setImageBitmap(smallBitmap);

        Log.i("ENDDDDD POSTECEXCUTE thread", "ENDDDD POSTECEXCUTE thread");
    }

谢谢

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    我不认为您可以直接从doInBackground 更新 UI,因为此方法中的代码在后台线程中运行,并且无法直接访问 IU 线程。您可以从 onPostExecuteonProgressUpdate 更新 UI。您可以通过调用publishProgressdoInBackground 调用后者。

    AsyncTask 的文档中有一个简单的例子,this one 稍微复杂一点。

    【讨论】:

      【解决方案2】:

      我想提出一种稍微不同的思考方式。您可以尝试让 doInBackground 方法解码并返回 Bitmap,然后在 onPostExecute 中将其绘制到画布上,而不是在后台拥有一个既下载又绘制位图的东西。这种安排应该可以防止您在画布上发生争用。

      查看您发布的代码,加载的位图被绘制到画布上。然后位图显示在图像中。在您发布的代码中,我看不到将加载的位图画布发送到屏幕的任何位置。

      可能值得仔细检查您正在绘制的图像是否具有足够大的高度和宽度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多