2012-01-21 62 views
0

我有3个按钮和一个Gallery.In我的画廊我有3个ImageAdapters一个为每个按钮的点击我设置它必须读取并加载到这些缩略图网址ImageAdapters和我正在使用AsyncTask。致命异常:#的AsyncTask 2

代码:

class AddImageTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... unused) { 
     try { 
     for (String url : PhotoURLS) { 
     String filename = url.substring(url.lastIndexOf("/") + 
     1,url.length()); 
     filename = "" + filename; 
     String thumburl = url.substring(0, url.lastIndexOf("/") + 1); 
     imageAdapter.addItem(LoadThumbnailFromURL(thumburl+ filename)); 
     publishProgress(); 
     } 

     for (String url : AudioThumbURLS) { 
     String filename = url.substring(url.lastIndexOf("/") + 
     1,url.length()); 
     filename = "" + filename; 
     String thumburl = url.substring(0, url.lastIndexOf("/") + 1); 
     imageAdapter1.addItem(LoadThumbnailFromURL(thumburl+ filename)); 
     publishProgress(); 
     } 
     for (String url : VideoThumbURLS) { 
     String filename = url.substring(url.lastIndexOf("/") + 
     1,url.length()); 
     filename = "" + filename; 
     String thumburl = url.substring(0, url.lastIndexOf("/") + 1); 
     imageAdapter2.addItem(LoadThumbnailFromURL(thumburl+ filename)); 
     publishProgress(); 
     } 

     } catch (Exception ae) { 
     ae.printStackTrace(); 
     Toast.makeText(getApplicationContext(),"Error found in the application", 
     Toast.LENGTH_LONG).show(); 
     } 
     return (null); 
    } 

    @Override 
    protected void onProgressUpdate(Void... unused) { 
     imageAdapter.notifyDataSetChanged(); 
     imageAdapter1.notifyDataSetChanged(); 
     imageAdapter2.notifyDataSetChanged(); 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
    } 
} 

而且我LoadThumbnailFromURL方法是:

private Drawable LoadThumbnailFromURL(String url) { 
    try { 
     URLConnection connection = new URL(url).openConnection(); 
     String contentType = connection.getHeaderField("Content-Type"); 
     boolean isImage = contentType.startsWith(""); 
     if (isImage) { 
      HttpGet httpRequest = new HttpGet(url); 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpResponse response = (HttpResponse) httpclient 
        .execute(httpRequest); 
      HttpEntity entity = response.getEntity(); 
      BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(
        entity); 
      InputStream is = bufferedHttpEntity.getContent(); 
      Drawable d = Drawable.createFromStream(is, "src name"); 
      return d; 
     } else { 
      Bitmap b = BitmapFactory.decodeResource(getResources(), 
        R.drawable.icon); 
      Drawable d = new BitmapDrawable(b); 
      return d; 
     } 
    } catch (Exception e) { 
     Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG) 
       .show(); 
     Log.e(e.getClass().getName(), e.getMessage(), e); 

    } 
    return null; 
} 

应用程序启动时不错,但之后的某个抛出错误为:

01-21 15:16 :23.750:E/AndroidRuntime(8292):致命异常:的AsyncTask#2 01-21 15:16:23.750:E/AndroidRuntime(8292):在JAV a.util.concurrent.FutureTask $ Sync.innerSetException(FutureTask.java:273) 01-21 15:16:23.750:E/AndroidRuntime(8292):在java.util.concurrent.FutureTask.setException(FutureTask.java: 124) 01-21 15:16:23.750:E/AndroidRuntime(8292):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:307) 01-21 15:16:23.750:E/AndroidRuntime(8292):在java.util.concurrent.FutureTask.run(FutureTask.java:137) 01-21 15:16:23.750:E/AndroidRuntime(8292):在java.util.concurrent.FutureTask中$同步。 innerRun(FutureTask.java:305)

可能的原因是什么?如何解决?

+0

你可以尝试仅在更新的适配器上调用notifyDataSetChanged(),看看是否是这个问题。 – Cata

+0

你的意思是说我需要在'onPostExecute'方法内调用'notifyDataSetChanged()'? –

+0

nope,我的意思是通过onPostExecute()方法传递一个整数或其他信息来知道哪个适配器已更新并只更新该特定的适配器 – Cata

回答

3

任何机会,你是捕获异常,但进入内部你钓到的鱼的另一个异常{}?由于它位于不同的(非UI)线程上,因此不要尝试使用Toast来通知您自己的错误。