Android 从动态列表下载图像并显示在GridView中
我部分遵循了从url下载图像并在gridview中显示的步骤。有了一个静态列表,一切正常 我试图通过使用jsoup解析网页并创建自己的url列表,从web上获取一些url。程序一启动就崩溃了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
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);