对异步图像加载感到困惑

时间:2014-05-19 14:46:10

标签: android

我想使用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);
        }



    }

3 个答案:

答案 0 :(得分:4)

我看到的一些事情:

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

2)你不应该多次拨打setContentView()

3)无需投射AsyncTask

我建议你花一些时间浏览一些教程,这样你就可以获得一个可靠的Android基础。

答案 1 :(得分:2)

好的,所以这是最快的方式来解决您的特定问题(例如,获取工作代码段的最少更改),但我会跟进应该在这里的内容。

首先,当我完全按照您的方式运行您的代码时,我发现您在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();

在您的AsyncTask

@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_main.xml才能执行此操作,但以下只是示例:

<强> activity_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>

现在使用上面的布局文件,您可以将onCreate()方法的开头更改为如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    img = (ImageView) findViewById(R.id.image_view);

    Myclass=(asynclass) new asynclass().execute();
}

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

我希望这有帮助!

答案 2 :(得分:0)

这段代码与@ Emmanuel的评论应该有效。花时间比较你和我的代码。阅读教程。并查看OpenSource库中的一些资源。

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);
            }
        }

    }
}