即使在使用AsyncTask.Status.FINISHED之后,Async也返回null

时间:2012-10-31 17:28:55

标签: android android-asynctask

下面是我的Async类

public class GetBitMapFromURL   extends AsyncTask<String, Integer, String>
{
    byte[] tempByte;
    private Bitmap bmap;
@Override
    protected String doInBackground(String... params) 
    {
        // TODO Auto-generated method stub
        String stringUrl = params[0];
        //bmap = null;
        try 
        {
            URL url = new URL(stringUrl);
            InputStream is = (InputStream) url.getContent();
            byte[] buffer = new byte[8192];
            int bytesRead;
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            while ((bytesRead = is.read(buffer)) != -1) 
            {
                output.write(buffer, 0, bytesRead);
            }
            tempByte = output.toByteArray();
        }
        catch (MalformedURLException e) 
        {
            e.printStackTrace();

        } 
        catch (IOException e) 
        {
            e.printStackTrace();

        }
        return "Success";
    }

    @Override
    protected void onPostExecute(String result) 
    {
        super.onPostExecute(result);
        Bitmap tempBitMap = BitmapFactory.decodeByteArray(tempByte, 0, tempByte.length);
        //Log.d("Bitmap bmap value on PostExecute", "bmap="+bmap);
        setBitMap(tempBitMap);
        //imageView.setImageBitmap(bImg);
    }
    void setBitMap(Bitmap bitMapSet)
    {
        this.bmap  = bitMapSet;
        //Log.d("Bitmap bmap value", "bmap="+bmap);
    }
    Bitmap returnBitmap()
    {
        //Log.d("Bitmap bmap value", "bmap="+bmap);
        return bmap;
    }

}

尽管在我的活动中执行了以下操作,但returnBitMap()返回null。

GetBitMapFromURL gbmap1 = new GetBitMapFromURL();       //Obtain medium bitmap
    gbmap1.execute(applicationImageMediumURL);
    if(gbmap1.getStatus() == AsyncTask.Status.FINISHED)
    {
        applicationMediumBitMap = gbmap1.returnBitmap();
     }

建议我哪里出错了。

1 个答案:

答案 0 :(得分:1)

不要这样做,使用AsyncTask.onPostExecute()方法来更新UI,如

@Override
protected void onPostExecute(String result) 
{
    super.onPostExecute(result);
    applicationMediumBitMap  = BitmapFactory.decodeByteArray(tempByte, 0, tempByte.length);
    //Log.d("Bitmap bmap value on PostExecute", "bmap="+bmap);

   // call any method on the activity to continue the process..
   otherStuff();
}

并删除代码

  if(gbmap1.getStatus() == AsyncTask.Status.FINISHED)
   {
        applicationMediumBitMap = gbmap1.returnBitmap();
    }

   // other stuff code

在Activity onCreate()中(我猜)。将以下代码放在自己的Activity方法中,并在onPostExecute()中调用它。

private void otherStuff() {
   // other stuff code
}