在Java中,是否存在“do when”循环这样的事情?

时间:2016-06-03 15:10:30

标签: java android bitmap

好吧,这可能是一个noob问题,但我无法找到任何帮助我的东西。我在ImageView上加载BitMap作为异步任务,在这个类中:

class MyNetworkTask extends AsyncTask<URL, Void, Bitmap> {

ImageView tIV;

public MyNetworkTask(ImageView iv){
    tIV = iv;
}

@Override
protected Bitmap doInBackground(URL... urls) {

    Bitmap networkBitmap = null;

    URL networkUrl = urls[0]; //Load the first element
    try {
        networkBitmap = BitmapFactory.decodeStream(
                networkUrl.openConnection().getInputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }

    return networkBitmap;
}

@Override
protected void onPostExecute(Bitmap result) {
    tIV.setImageBitmap(result);
}

这就是我如何从我的活动中调用它:

new MyNetworkTask(myImageView).execute(photo_url);

但这会是异步的,对吧?这意味着如果在我的Activity中我尝试使用BitMap,它将是 null

是否存在类似“何时?? ”的循环,等待这个BitMap,而不是做某事?

或者有没有办法处理来自该异步类的回调?

3 个答案:

答案 0 :(得分:0)

如果您正在谈论存储位图以便以后可以访问它,那么您应该在AsyncTask之外创建一个public Bitmap bitmap;,然后从AsyncTask中填充它。

class MyNetworkTask extends AsyncTask<URL, Void, Bitmap> {

ImageView tIV;

public MyNetworkTask(ImageView iv){
    tIV = iv;
}

@Override
protected Bitmap doInBackground(URL... urls) {

    Bitmap networkBitmap = null;

    URL networkUrl = urls[0]; //Load the first element
    try {
        networkBitmap = BitmapFactory.decodeStream(
                networkUrl.openConnection().getInputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }

    return networkBitmap;
}

@Override
protected void onPostExecute(Bitmap result) {
    if(result != null){
        bitmap = result;
    }
    tIV.setImageBitmap(result);
}

答案 1 :(得分:0)

您可以使用模式观察器。查看此链接以了解实施http://www.tutorialspoint.com/design_pattern/observer_pattern.htm

答案 2 :(得分:-1)

“什么时候”是什么意思? 我想到了类似的东西:

do{
    networkBitmap = BitmapFactory.decodeStream(
            networkUrl.openConnection().getInputStream());
}while(networkBitmap==null)

同样适用于while循环:

while(networkBitmap==null){
    networkBitmap = BitmapFactory.decodeStream(
            networkUrl.openConnection().getInputStream());
}