Android 对异步图像加载感到困惑吗

Android 对异步图像加载感到困惑吗,android,Android,我尝试使用AsyncTask类从原始文件夹中检索图像。我花了几个小时来研究这个样品。我没有任何异常,但屏幕上不会显示任何内容。可能遗漏了很多内容。请检查我的代码。我又做错了什么 public class MainActivity extends Activity { ImageView img; asynclass Myclass; @Override protected void onCreate(Bundle savedInstanceState) {

我尝试使用AsyncTask类从原始文件夹中检索图像。我花了几个小时来研究这个样品。我没有任何异常,但屏幕上不会显示任何内容。可能遗漏了很多内容。请检查我的代码。我又做错了什么

public class MainActivity extends Activity {

    ImageView img;
    asynclass Myclass;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img=new ImageView(this);
    /***
     *  Field[] filelds=R.raw.class.getFields();
        String [] names=new String[filelds.length];
    for (int i = 0; i < filelds.length; i++) {
       names[i]=filelds[i].getName()+".jpg";

        }
     * 
     * 
     * 
     * */

        //Toast.makeText(MainActivity.this, names[0], 0).show();
        String s="android.resource://"+getApplication().getPackageName()+"/raw/d.jpg/";

        this.setContentView(img, 
            new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
        Myclass=(asynclass) new asynclass().execute(s);


    }

    public class asynclass extends AsyncTask<String, Void, Bitmap>{

        @Override
        protected Bitmap doInBackground(String... params) {

            Bitmap bmp=null;

            bmp=BitmapFactory.decodeFile(params[0]);

            return bmp;
        }



        @Override
        protected void onPostExecute(Bitmap result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if(result!=null){
                img.setImageBitmap(result);

            }
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
        }



    }
公共类MainActivity扩展活动{
图像视图img;
异步类Myclass;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=新图像视图(本);
/***
*字段[]filelds=R.raw.class.getFields();
字符串[]名称=新字符串[filelds.length];
for(int i=0;i
我看到的一些事情:

1) 您可以使用
R.raw.fileName
raw
文件夹访问资源

2) 您不应该多次调用
setContentView()

3) 无需强制转换您的
异步任务

<>我建议你花些时间浏览一些教程,这样你就可以得到一个坚实的Android基础。

好的,所以这是修复你的特定问题的最快的方法(如在最少的改动中得到一个工作片段),但是我将继续关注这里应该做的。

首先,当我完全按照您的方式运行代码时,我发现您在
AsyncTask
中得到的结果返回
null
。这是因为您给出的绝对文件路径不是
BitmapFactory
所要的

作为快速修复,请进行以下更改:

//Remove this line
//String s="android.resource://"+getApplication().getPackageName()+"/raw/d.jpg/";

this.setContentView(img, 
       new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

//Remove the "s" from your execute
Myclass=(asynclass) new asynclass().execute();
在您的
异步任务中

@Override
protected Bitmap doInBackground(String... params) {

   Bitmap bmp=null;

   //Change this line to use decodeResource instead of decodeFile
   bmp=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.raw.d);

   return bmp;
}
这将使您的代码正常工作,但它不便于复制

现在,关于如何操作,您需要调用两次
setContentView()
,这是多余的,然后创建一个
ImageView
,并用不同的布局资源替换您设置的布局资源

为此,您需要查看xml文件
activity\u main.xml
,但以下只是它的一个示例:

活动\u main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
习惯使用资源文件将使以后加载多个图像和视图更加容易


我希望这能有所帮助!

这段带有@Emmanuel注释的代码应该可以工作。花点时间比较一下你的和我的代码。阅读教程。并在开源库中查看一些源代码

public class MainActivity extends Activity {
    private ImageView mImage;
    private ImageLoader loader;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 2) You shouldn't call setContentView() more than once
        setContentView(R.layout.activity_main);

        mImage = new ImageView(this);

        // 3) No need to cast your AsyncTask.
        new ImageLoader().execute(R.raw.d);
    }

    public class ImageLoader extends AsyncTask<Integer, Void, Bitmap> {

        @Override
        protected Bitmap doInBackground(Integer... params) {
            // 1) You can access resources from the raw folder using R.raw.fileName
            InputStream is = getResources().openRawResource(params[0]);
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            return bitmap;
        }

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

    }
}
公共类MainActivity扩展活动{
私有图像视图;
私人图像加载器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//2)不应多次调用setContentView()
setContentView(R.layout.activity_main);
mImage=新图像视图(此);
//3)无需强制执行异步任务。
新的ImageLoader().execute(R.raw.d);
}
公共类ImageLoader扩展了异步任务{
@凌驾
受保护位图doInBackground(整数…参数){
//1)您可以使用R.raw.fileName从raw文件夹访问资源
InputStream=getResources().openRawResource(参数[0]);
位图位图=BitmapFactory.decodeStream(is);
返回位图;
}
@凌驾
受保护的void onPostExecute(位图结果){
如果(结果!=null){
mImage.setImageBitmap(结果);
}
}
}
}

为什么要调用
setContentView
方法两次?在
decodeFile
之后
bmp
是否为空?正如@Emmanuel所说,您有很多基本错误,请尝试花些时间开始使用Android。
public class MainActivity extends Activity {
    private ImageView mImage;
    private ImageLoader loader;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 2) You shouldn't call setContentView() more than once
        setContentView(R.layout.activity_main);

        mImage = new ImageView(this);

        // 3) No need to cast your AsyncTask.
        new ImageLoader().execute(R.raw.d);
    }

    public class ImageLoader extends AsyncTask<Integer, Void, Bitmap> {

        @Override
        protected Bitmap doInBackground(Integer... params) {
            // 1) You can access resources from the raw folder using R.raw.fileName
            InputStream is = getResources().openRawResource(params[0]);
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            return bitmap;
        }

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

    }
}