2012-09-25 21 views
2

如何使用Asynctask(onPreExecute()方法)使第一次看起来像BBC News android应用程序。请帮助我,我的助手类代码是在这里...Android中的AsyncTask:如何设置背景图像的ProgressBar?

UrlImageViewHelper.java

package com.warriorpoint.androidxmlsimple; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.util.ArrayList; 
import java.util.Hashtable; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.params.HttpClientParams; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpParams; 

import android.app.Activity; 

import android.content.Context; 
import android.content.res.AssetManager; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.net.http.AndroidHttpClient; 
import android.os.AsyncTask; 
import android.util.DisplayMetrics; 

import android.widget.ImageView; 

public final class UrlImageViewHelper { 
    private static final String LOGTAG = "UrlImageViewHelper"; 
    public static int copyStream(InputStream input, OutputStream output) throws IOException 
    { 
     byte[] stuff = new byte[1024]; 
     int read = 0; 
     int total = 0; 
     while ((read = input.read(stuff)) != -1) 
     { 
      output.write(stuff, 0, read); 
      total += read; 
     } 
     return total; 
    } 

    static Resources mResources; 
    static DisplayMetrics mMetrics; 
    private static void prepareResources(Context context) { 
     if (mMetrics != null) 
      return; 
     mMetrics = new DisplayMetrics(); 
     Activity act = (Activity)context; 
     act.getWindowManager().getDefaultDisplay().getMetrics(mMetrics); 
     AssetManager mgr = context.getAssets(); 
     mResources = new Resources(mgr, mMetrics, context.getResources().getConfiguration()); 
    } 

    private static BitmapDrawable loadDrawableFromStream(Context context, InputStream stream) { 
     prepareResources(context); 
     final Bitmap bitmap = BitmapFactory.decodeStream(stream); 
     //Log.i(LOGTAG, String.format("Loaded bitmap (%dx%d).", bitmap.getWidth(), bitmap.getHeight())); 
     return new BitmapDrawable(mResources, bitmap); 
    } 

    public static final int CACHE_DURATION_INFINITE = Integer.MAX_VALUE; 
    public static final int CACHE_DURATION_ONE_DAY = 1000 * 60 * 60 * 24; 
    public static final int CACHE_DURATION_TWO_DAYS = CACHE_DURATION_ONE_DAY * 2; 
    public static final int CACHE_DURATION_THREE_DAYS = CACHE_DURATION_ONE_DAY * 3; 
    public static final int CACHE_DURATION_FOUR_DAYS = CACHE_DURATION_ONE_DAY * 4; 
    public static final int CACHE_DURATION_FIVE_DAYS = CACHE_DURATION_ONE_DAY * 5; 
    public static final int CACHE_DURATION_SIX_DAYS = CACHE_DURATION_ONE_DAY * 6; 
    public static final int CACHE_DURATION_ONE_WEEK = CACHE_DURATION_ONE_DAY * 7; 

    public static void setUrlDrawable(final ImageView imageView, final String url, int defaultResource) { 
     setUrlDrawable(imageView.getContext(), imageView, url, defaultResource, CACHE_DURATION_THREE_DAYS); 
    } 

    public static void setUrlDrawable(final ImageView imageView, final String url) { 
     setUrlDrawable(imageView.getContext(), imageView, url, null, CACHE_DURATION_THREE_DAYS); 
    } 

    public static void loadUrlDrawable(final Context context, final String url) { 
     setUrlDrawable(context, null, url, null, CACHE_DURATION_THREE_DAYS); 
    } 

    public static void setUrlDrawable(final ImageView imageView, final String url, Drawable defaultDrawable) { 
     setUrlDrawable(imageView.getContext(), imageView, url, defaultDrawable, CACHE_DURATION_ONE_DAY); 
    } 

    public static void setUrlDrawable(final ImageView imageView, final String url, int defaultResource, long cacheDurationMs) { 
     setUrlDrawable(imageView.getContext(), imageView, url, defaultResource, cacheDurationMs); 
    } 

    public static void loadUrlDrawable(final Context context, final String url, long cacheDurationMs) { 
     setUrlDrawable(context, null, url, null, cacheDurationMs); 
    } 

    public static void setUrlDrawable(final ImageView imageView, final String url, Drawable defaultDrawable, long cacheDurationMs) { 
     setUrlDrawable(imageView.getContext(), imageView, url, defaultDrawable, cacheDurationMs); 
    } 

    private static void setUrlDrawable(final Context context, final ImageView imageView, final String url, int defaultResource, long cacheDurationMs) { 
     Drawable d = null; 
     if (defaultResource != 0) 
      d = imageView.getResources().getDrawable(defaultResource); 
     setUrlDrawable(context, imageView, url, d, cacheDurationMs); 
    } 

    private static boolean isNullOrEmpty(CharSequence s) { 
     return (s == null || s.equals("") || s.equals("null") || s.equals("NULL")); 
    } 

    private static boolean mHasCleaned = false; 

    public static String getFilenameForUrl(String url) { 
     return "" + url.hashCode() + ".urlimage"; 
    } 

    private static void cleanup(Context context) { 
     if (mHasCleaned) 
      return; 
     mHasCleaned = true; 
     try { 
      // purge any *.urlimage files over a week old 
      String[] files = context.getFilesDir().list(); 
      if (files == null) 
       return; 
      for (String file : files) { 
       if (!file.endsWith(".urlimage")) 
        continue; 

       File f = new File(context.getFilesDir().getAbsolutePath() + '/' + file); 
       if (System.currentTimeMillis() > f.lastModified() + CACHE_DURATION_ONE_WEEK) 
        f.delete(); 
      } 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void setUrlDrawable(final Context context, final ImageView imageView, final String url, final Drawable defaultDrawable, long cacheDurationMs) { 
     cleanup(context); 
     // disassociate this ImageView from any pending downloads 
     if (imageView != null) 
      mPendingViews.remove(imageView); 

     if (isNullOrEmpty(url)) { 
      if (imageView != null) 
       imageView.setImageDrawable(defaultDrawable); 
      return; 
     } 

     final UrlImageCache cache = UrlImageCache.getInstance(); 
     Drawable d = cache.get(url); 
     if (d != null) { 
      //Log.i(LOGTAG, "Cache hit on: " + url); 
      if (imageView != null) 
       imageView.setImageDrawable(d); 
      return; 
     } 

     final String filename = getFilenameForUrl(url); 

     File file = context.getFileStreamPath(filename); 
     if (file.exists()) { 
      try { 
       if (cacheDurationMs == CACHE_DURATION_INFINITE || System.currentTimeMillis() < file.lastModified() + cacheDurationMs) { 
        //Log.i(LOGTAG, "File Cache hit on: " + url + ". " + (System.currentTimeMillis() - file.lastModified()) + "ms old."); 
        FileInputStream fis = context.openFileInput(filename); 
        BitmapDrawable drawable = loadDrawableFromStream(context, fis); 
        fis.close(); 
        if (imageView != null) 
         imageView.setImageDrawable(drawable); 
        cache.put(url, drawable); 
        return; 
       } 
       else { 
        //Log.i(LOGTAG, "File cache has expired. Refreshing."); 
       } 
      } 
      catch (Exception ex) { 
      } 
     } 

     // null it while it is downloading 
     if (imageView != null) 
      imageView.setImageDrawable(defaultDrawable); 

     // since listviews reuse their views, we need to 
     // take note of which url this view is waiting for. 
     // This may change rapidly as the list scrolls or is filtered, etc. 
     //Log.i(LOGTAG, "Waiting for " + url); 
     if (imageView != null) 
      mPendingViews.put(imageView, url); 

     ArrayList<ImageView> currentDownload = mPendingDownloads.get(url); 
     if (currentDownload != null) { 
      // Also, multiple vies may be waiting for this url. 
      // So, let's maintain a list of these views. 
      // When the url is downloaded, it sets the imagedrawable for 
      // every view in the list. It needs to also validate that 
      // the imageview is still waiting for this url. 
      if (imageView != null) 
       currentDownload.add(imageView); 
      return; 
     } 

     final ArrayList<ImageView> downloads = new ArrayList<ImageView>(); 
     if (imageView != null) 
      downloads.add(imageView); 
     mPendingDownloads.put(url, downloads); 

     AsyncTask<Void, Void, Drawable> downloader = new AsyncTask<Void, Void, Drawable>() { 



      @Override 
      protected Drawable doInBackground(Void... params) { 
       AndroidHttpClient client = AndroidHttpClient.newInstance(context.getPackageName()); 
       try { 
        HttpGet get = new HttpGet(url); 
        final HttpParams httpParams = new BasicHttpParams(); 
        HttpClientParams.setRedirecting(httpParams, true); 
        get.setParams(httpParams); 
        HttpResponse resp = client.execute(get); 
        int status = resp.getStatusLine().getStatusCode(); 
        if(status != HttpURLConnection.HTTP_OK){ 
//      Log.i(LOGTAG, "Couldn't download image from Server: " + url + " Reason: " + resp.getStatusLine().getReasonPhrase() + "/" + status); 
         return null; 
        } 
        HttpEntity entity = resp.getEntity(); 
//     Log.i(LOGTAG, url + " Image Content Length: " + entity.getContentLength()); 
        InputStream is = entity.getContent(); 
        FileOutputStream fos = context.openFileOutput(filename, Context.MODE_PRIVATE); 
        copyStream(is, fos); 
        fos.close(); 
        is.close(); 
        FileInputStream fis = context.openFileInput(filename); 
        return loadDrawableFromStream(context, fis); 
       } 
       catch (Exception ex) { 
//     Log.e(LOGTAG, "Exception during Image download of " + url, ex); 
        return null; 
       } 
       finally { 
        client.close(); 
       } 
      } 


      @Override 
      protected void onPostExecute(Drawable result) { 
       if (result == null) 
        result = defaultDrawable; 
       mPendingDownloads.remove(url); 
       cache.put(url, result); 
       for (ImageView iv: downloads) { 
        // validate the url it is waiting for 
        String pendingUrl = mPendingViews.get(iv); 
        if (!url.equals(pendingUrl)) { 
         //Log.i(LOGTAG, "Ignoring out of date request to update view for " + url); 
         continue; 
        } 
        mPendingViews.remove(iv); 
        if (result != null) { 
         final Drawable newImage = result; 

         Drawable newSize=resize(newImage); 


         final ImageView imageView = iv; 

         imageView.setImageDrawable(newSize); 
        } 
       } 
      } 

      private BitmapDrawable resize(Drawable newImage) { 
       // TODO Auto-generated method stub 

       Bitmap d = ((BitmapDrawable)newImage).getBitmap(); 
       Bitmap bitmapOrig = Bitmap.createScaledBitmap(d, 75, 75, false); 
       return new BitmapDrawable(bitmapOrig);            
      } 
     }; 
     downloader.execute(); 
    } 



    private static Hashtable<ImageView, String> mPendingViews = new Hashtable<ImageView, String>(); 
    private static Hashtable<String, ArrayList<ImageView>> mPendingDownloads = new Hashtable<String, ArrayList<ImageView>>(); 
} 

我的主要活动是MessageList.java。

+0

这是什么?没有遗憾,但请在本网站发布问题之前阅读常见问题解答。 – Shrikant

+0

sory man但是如何在上面的代码中使用onPreExecute()方法。我想在xml解析期间显示带背景图像的图像。当我的数据在后台下载,然后我的进度条删除并显示我的主要活动。 – akash

回答

0

像这样

private final ProgressDialog dialog = new ProgressDialog(this.context); 
    @Override 
    protected void onPreExecute() { 
      this.dialog.setMessage("Fecthing Image"); 
      this.dialog.setTitle("Please Wait"); 
      this.dialog.setIcon(R.drawable."Any Image here"); 
      this.dialog.show(); 
    }