繁体   English   中英

Android:无法在AsyncTask中解析方法'findViewById(int)'

[英]Android: cannot resolve method 'findViewById(int)' in AsyncTask

按照本教程我已经设置了一个应用程序,该应用程序应该能够从URL下载图像并将其放入ImageView。 唯一的问题是它无法找到findViewById,因为它位于Activity类而不是AsyncTask类中。 代码在这里:

package com.example.weather2;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;


public class ImageDownloader
        extends AsyncTask<String, Integer, Bitmap> {
protected void onPreExecute(){
    //Setup is done here
}
@Override
protected Bitmap doInBackground(String... params) {
    //TODO Auto-generated method stub
    try{
        URL url = new URL(params[0]);
        HttpURLConnection httpCon =
                (HttpURLConnection)url.openConnection();
        if(httpCon.getResponseCode() != 200)
            throw new Exception("Failed to connect");
        InputStream is = httpCon.getInputStream();
        return BitmapFactory.decodeStream(is);
    }catch(Exception e){
        Log.e("Image", "Failed to load image", e);
    }
    return null;
}
protected void onProgressUpdate(Integer... params){
    //Update a progress bar here, or ignore it, I didn't do it
}
protected void onPostExecute(Bitmap img){
    ImageView iv = (ImageView) findViewById(R.id.imageView); //here is where the issue is
    if(iv!=null && img!=null){
        iv.setImageBitmap(img);
    }
}
protected void onCancelled(){
}
}

当我用问题注释掉这些行时,我没有得到任何错误,这让我认为它有效,但我无法分辨,因为没有发布图像。 任何帮助解决这个问题将不胜感激。

findViewById是Activity类的一种方法。

你有

 public class ImageDownloader
    extends AsyncTask<String, Integer, Bitmap>  // not a activity class

如果您需要在活动中返回数据,则可以使用interface作为活动的回调。

我会在Activity中更新ui。 看看@ blackbelts的回答

如何从AsyncTask返回一个布尔值?

要么

使AsyncTask成为Activity类的内部类,并在onPostExecute更新ui

您也许会发现Alex Loockwood的这篇博客很有趣

http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

而不是在AsyncTask中调用findViewById() ,而是将ImageView作为参数传递:

public class ImageDownloader extends AsyncTask<String, Integer, Bitmap> {
    final ImageView mImageView;

    public ImageDownloader(ImageView imageView) {
        mImageView = imageView;
    }

    // ...

配置/获取图像时直接使用您的活动。 这将解决您的问题。

public class ImageDownloader extends AsyncTask<String, Integer, Bitmap> {
    private Context context;

    public ImageDownloader(Activity yourActivity) {
        context = activity;
    }

    // ...

    protected void onPostExecute(Void... params){
        ImageView iv = (ImageView) context.findViewById(R.id.imageView); 
        if(iv!=null && img!=null){
            iv.setImageBitmap(img);
        }
    }
}

使用强制转换为AppCompatActivity,例如:

public class ImageDownloader extends AsyncTask<String, Integer, Bitmap> {
private Context context;

public ImageDownloader(Activity yourActivity) {
    context = yourActivity;
}

// ...

protected void onPostExecute(Void... params){
    //Here
    ImageView iv = (ImageView) ((AppCompatActivity) context).findViewById(R.id.imageView); 
    if(iv!=null && img!=null){
        iv.setImageBitmap(img);
    }
}

}

您可以将AsyncTask实现为活动的内部类。 并把ImageView iv = (ImageView) findViewById(R.id.imageView); 在你的活动的onCreate()方法中。 这就是我在项目中所做的。

或者您可以将activity.this作为参数传递给AsyncTask的构造函数。 并使用ImageView iv = (ImageView)activity. findViewById(R.id.imageView) ImageView iv = (ImageView)activity. findViewById(R.id.imageView)在您的AsyncTask的onPostExecute()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM