Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从动态列表下载图像并显示在GridView中_Android_List_Gridview_Dynamic_Jsoup - Fatal编程技术网

Android 从动态列表下载图像并显示在GridView中

Android 从动态列表下载图像并显示在GridView中,android,list,gridview,dynamic,jsoup,Android,List,Gridview,Dynamic,Jsoup,我部分遵循了从url下载图像并在gridview中显示的步骤。有了一个静态列表,一切正常 我试图通过使用jsoup解析网页并创建自己的url列表,从web上获取一些url。程序一启动就崩溃了 public class MainGridActivity extends Activity { private ImageAdapter mAdapter; private Bitmap mPlaceHolder; private String [] mMangaList = n

我部分遵循了从url下载图像并在gridview中显示的步骤。有了一个静态列表,一切正常

我试图通过使用jsoup解析网页并创建自己的url列表,从web上获取一些url。程序一启动就崩溃了

public class MainGridActivity extends Activity {

    private ImageAdapter mAdapter;
    private Bitmap mPlaceHolder;
    private String [] mMangaList = null;

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

        downloadMangaImages();

        GridView gridView = (GridView) findViewById(R.id.gridView);
        mAdapter = new ImageAdapter(this);
        setLoadingImage(R.drawable.empty_photo);

        gridView.setAdapter(mAdapter);
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_grid, menu);
        return true;
    }

    /**
     * sets a place holder bitmap while the actual bitmap is loading
     * 
     * @param resId
     */
    public void setLoadingImage(int resId) {
        mPlaceHolder =  BitmapFactory.decodeResource(getResources(), resId);
    }

    public void downloadMangaImages() { 
        try {
            Document doc = Jsoup.connect("http://mangafox.me/directory/").get();

            Element content = doc.getElementById("content");
            Elements links = content.getElementsByTag("img");

            mMangaList = new String[links.toArray().length];
            int i = 0;
            for(Element link : links) {
                mMangaList[i] = link.attr("src");
                i++;
            }

        } catch(IOException e) {}

    }


    private class ImageAdapter extends BaseAdapter {
        private Context mContext;
        public ImageAdapter (Context context) {
            mContext = context;
        }



        @Override
        public int getCount() {
            return mMangaList.length;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup container) {
            ImageView imageView;
            if(convertView == null) {
                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new GridView.LayoutParams(200,300));
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            } else {
                imageView = (ImageView) convertView;
            }

            loadImageToView(mMangaList[position],imageView);

            return imageView;
        }

    }

    public void loadImageToView(String url, ImageView imageView) {
        final BitmapWorkerTask task;
        final TaskReference taskReference;

        if(url == null) {
            return;
        }

        else if(cancelPotentialWork(url, imageView)) { // tries to cancel previous tasks on this imageView if possible 
            task = new BitmapWorkerTask(imageView);
            taskReference = new TaskReference(getResources(),task, mPlaceHolder);
            imageView.setImageDrawable(taskReference);
            task.execute(url);

        }
    }

    private static boolean cancelPotentialWork (String url, ImageView imageView) {
        BitmapWorkerTask previousTask = getBitmapWorkerTask(imageView);

        if(previousTask != null) {

            String previousUrl = previousTask.url;

            if(previousUrl == null || !previousUrl.equals(url)) {
                previousTask.cancel(true);
            } else {
                return false; // since task is already in progress, let it finish
            }
        }

        return true;
    }

    private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) {
        if(imageView != null) {
            final Drawable drawable = imageView.getDrawable();

            if(drawable instanceof TaskReference) {
                return ((TaskReference) drawable).getBitmapWorkerTask();
            }
        }
        return null;
    }

    private class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
        //Fields
        private final WeakReference<ImageView> mImageViewReference;
        private String url;

        //constructors
        public BitmapWorkerTask(ImageView imageView) {
            mImageViewReference = new WeakReference<ImageView> (imageView);
        }

        //main body
        @Override
        protected Bitmap doInBackground(String ... urls) { //Image not found in memory cache so start processing image here
            url = urls[0];
            return downloadBitmapFromURL(url);

        }


        @Override
        protected void onPostExecute(Bitmap bitmap) {
            if(isCancelled()) {
                bitmap = null;
            }

            if(mImageViewReference != null) {
                ImageView imageView = mImageViewReference.get();
                BitmapWorkerTask task = getBitmapWorkerTask(imageView);
                if(this == task) {
                    imageView.setImageBitmap(bitmap);
                }

            }


        }

        public Bitmap downloadBitmapFromURL(String urlString) {
            final int BUFFER_SIZE = 8 *1024;
            HttpURLConnection conn = null;
            InputStream is = null;

            try {
                final URL url = new URL(urlString);
                conn = (HttpURLConnection) url.openConnection();
                is = new BufferedInputStream(conn.getInputStream(), BUFFER_SIZE);


                return BitmapFactory.decodeStream(is);

            } catch(IOException e) {}

            finally {
                if(conn != null) {
                    conn.disconnect();
                }
                try {
                    if(is != null) {
                        is.close();
                    }

                } catch (IOException e) {}

            }

            return null;
        }
    }


    private class TaskReference extends BitmapDrawable {
        private final WeakReference<BitmapWorkerTask> mBitmapWorkerTaskReference;

        public TaskReference(Resources res, BitmapWorkerTask task, Bitmap placeHolder) {
            super(res, placeHolder);
            mBitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(task);
        }

        public BitmapWorkerTask getBitmapWorkerTask(){
            return mBitmapWorkerTaskReference.get();
        }
    }

}
公共类MainGridActivity扩展活动{
专用图像适配器mAdapter;
私人身份证持有人;
私有字符串[]mMangaList=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main_网格);
下载手册();
GridView GridView=(GridView)findViewById(R.id.GridView);
mAdapter=新的图像适配器(此);
设置加载图像(R.可绘制。空照片);
setAdapter(mAdapter);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单主网格,菜单);
返回true;
}
/**
*在加载实际位图时设置占位符位图
* 
*@param resId
*/
公共void设置加载映像(int resId){
mPlaceHolder=BitmapFactory.decodeResource(getResources(),resId);
}
public void downloadmangs(){
试一试{
Document doc=Jsoup.connect(“http://mangafox.me/directory/).get();
元素内容=doc.getElementById(“内容”);
Elements links=content.getElementsByTag(“img”);
mMangaList=新字符串[links.toArray().length];
int i=0;
用于(元素链接:链接){
mMangaList[i]=link.attr(“src”);
i++;
}
}捕获(IOE){}
}
私有类ImageAdapter扩展了BaseAdapter{
私有上下文;
公共ImageAdapter(上下文){
mContext=上下文;
}
@凌驾
public int getCount(){
返回mMangaList.length;
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组容器){
图像视图图像视图;
if(convertView==null){
imageView=新的imageView(mContext);
setLayoutParams(新的GridView.LayoutParams(200300));
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
}否则{
imageView=(imageView)convertView;
}
loadImageToView(mMangaList[position],imageView);
返回图像视图;
}
}
public void loadImageToView(字符串url,ImageView ImageView){
最终BitmapWorkerTask任务;
最终任务参考任务参考;
如果(url==null){
返回;
}
else if(cancelPotentialWork(url,imageView)){//如果可能,尝试取消此imageView上以前的任务
任务=新的位图工作任务(imageView);
taskReference=新的taskReference(getResources(),task,mPlaceHolder);
imageView.setImageDrawable(taskReference);
task.execute(url);
}
}
私有静态布尔cancelPotentialWork(字符串url,ImageView ImageView){
BitmapWorkerTask previousTask=getBitmapWorkerTask(图像视图);
if(上一个任务!=null){
字符串previousUrl=previousTask.url;
如果(previousUrl==null | |!previousUrl.equals(url)){
上一个任务。取消(true);
}否则{
return false;//由于任务已在进行中,请让它完成
}
}
返回true;
}
私有静态BitmapWorkerTask getBitmapWorkerTask(ImageView ImageView){
如果(imageView!=null){
final Drawable Drawable=imageView.getDrawable();
if(任务引用的可绘制实例){
return((TaskReference)drawable.getBitmapWorkerTask();
}
}
返回null;
}
私有类BitmapWorkerTask扩展了AsyncTask{
//田地
私有最终WeakReference mImageViewReference;
私有字符串url;
//建设者
公共位图工作任务(ImageView ImageView){
mImageViewReference=新的WeakReference(图像视图);
}
//主体
@凌驾
受保护的位图doInBackground(字符串…URL){//内存缓存中找不到图像,因此请在此处开始处理图像
url=url[0];
返回下载的BitMapFromURL(url);
}
@凌驾
受保护的void onPostExecute(位图){
如果(isCancelled()){
位图=空;
}
if(mImageViewReference!=null){
ImageView=mImageViewReference.get();
BitmapWorkerTask任务=getBitmapWorkerTask(图像视图);
if(this==任务){
设置图像位图(位图);
}
}
}
公共位图下载BitMapFromURL(字符串urlString){
最终整数缓冲区大小=8*1024;
HttpURLConnection conn=null;
InputStream=null;
试一试{
最终URL=新URL(URL字符串);
conn=(HttpURLConnection)url.openConnection();
is=新的BufferedInputStream(连接getInputStream(),缓冲区大小);
返回BitmapFactory.decodeStream(is);
}捕获(IOE){}
最后{
如果(conn!=null){
连接断开();
}
试一试{
06-18 21:24:28.845: D/AbsListView(5721): Get MotionRecognitionManager
06-18 21:24:28.865: D/AndroidRuntime(5721): Shutting down VM
06-18 21:24:28.865: W/dalvikvm(5721): threadid=1: thread exiting with uncaught exception (group=0x40ccc2a0)
06-18 21:24:28.870: E/AndroidRuntime(5721): FATAL EXCEPTION: main
06-18 21:24:28.870: E/AndroidRuntime(5721): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gridviewtest/com.gridviewtest.MainGridActivity}: android.os.NetworkOnMainThreadException
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.app.ActivityThread.access$600(ActivityThread.java:140)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.os.Looper.loop(Looper.java:137)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.app.ActivityThread.main(ActivityThread.java:4898)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at java.lang.reflect.Method.invokeNative(Native Method)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at java.lang.reflect.Method.invoke(Method.java:511)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at dalvik.system.NativeStart.main(Native Method)
06-18 21:24:28.870: E/AndroidRuntime(5721): Caused by: android.os.NetworkOnMainThreadException
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:425)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:410)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:164)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at org.jsoup.helper.HttpConnection.get(HttpConnection.java:153)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at com.gridviewtest.MainGridActivity.downloadMangaImages(MainGridActivity.java:71)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at com.gridviewtest.MainGridActivity.onCreate(MainGridActivity.java:42)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.app.Activity.performCreate(Activity.java:5206)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
06-18 21:24:28.870: E/AndroidRuntime(5721):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
06-18 21:24:28.870: E/AndroidRuntime(5721):     ... 11 more
String targetURL = ....
new AsyncTask<String, Void, String[]>(){
 protected String[] doInBackground(String ... args) {
  try {

            Document doc = Jsoup.connect("http://mangafox.me/directory/").get();

            Element content = doc.getElementById("content");
            Elements links = content.getElementsByTag("img");

            String[] mMangaList = new String[links.toArray().length];
            int i = 0;
            for(Element link : links) {
                mMangaList[i] = link.attr("src");
                i++;
            }
 return mMangaList;
        } catch(IOException e) {return null;}
 }
 protected void onPostExecute(String[] result) {
if(result != null) {
 // create the adapter and load it in list
}
}
}.execute(targetURL);