`
wqkerry
  • 浏览: 13538 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Afinal的简单应用(二)

阅读更多

     上篇中叙述了Afinal的finalDB和finalActivity的用法,接下来讲FinalHttp和FinalBitmap。

 

 FinalHttp的使用方法:

        FinalHttp 对 HttpClient再次封装,最简洁的就是增加了许多回调的方法,对Get 和 Post 请求进行了简化。此外还有put,delete和download方法。另外一点就是FinalHttp加入线程池操作,默认的Http请求池连接为3。下面是为FinalHttp可配置的操作.

FinalHttp finalHttp = new FinalHttp();
finalHttp.addHeader("Accept-Charset", "UTF-8");//配置http请求头
finalHttp.configCharset("UTF-8");
finalHttp.configCookieStore(null);
finalHttp.configRequestExecutionRetryCount(3);//请求错误重试次数
finalHttp.configSSLSocketFactory(null);
finalHttp.configTimeout(5000);//超时时间
finalHttp.configUserAgent("Mozilla/5.0");//配置客户端信息

    源码中的get请求:

// ------------------get 请求-----------------------
	public void get(String url, AjaxCallBack<? extends Object> callBack) {
		get(url, null, callBack);
	}

	public void get(String url, AjaxParams params,
			AjaxCallBack<? extends Object> callBack) {
		sendRequest(httpClient, httpContext,
				new HttpGet(getUrlWithQueryString(url, params)), null, callBack);
	}

	public void get(String url, Header[] headers, AjaxParams params,
			AjaxCallBack<? extends Object> callBack) {
		HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
		if (headers != null)
			request.setHeaders(headers);
		sendRequest(httpClient, httpContext, request, null, callBack);
	}

 上述有三个get方法,不同之处在于参数的不同,先看最简单的get方法使用:

FinalHttp fh = new FinalHttp();
fh.get("http://www.yangfuhai.com", new AjaxCallBack(){

    @Override
    public void onLoading(long count, long current) { //每1秒钟自动被回调一次
            textView.setText(current+"/"+count);
    }

    @Override
    public void onSuccess(String t) {
            textView.setText(t==null?"null":t);
    }

    @Override
    public void onStart() {
        //开始http请求的时候回调
    }

    @Override
    public void onFailure(Throwable t, String strMsg) {
        //加载失败的时候回调
    }
});

    上述get方法中有两个参数,一为访问的路径,一个为回调函数,请求后的相应操作可以在回调函数中处理。

源码中的post请求:

	// ------------------post 请求-----------------------
	public void post(String url, AjaxCallBack<? extends Object> callBack) {
		post(url, null, callBack);
	}

	public void post(String url, AjaxParams params,
			AjaxCallBack<? extends Object> callBack) {
		post(url, paramsToEntity(params), null, callBack);
	}

	public void post(String url, HttpEntity entity, String contentType,
			AjaxCallBack<? extends Object> callBack) {
		sendRequest(httpClient, httpContext,
				addEntityToRequestBase(new HttpPost(url), entity), contentType,
				callBack);
	}

	public <T> void post(String url, Header[] headers, AjaxParams params,
			String contentType, AjaxCallBack<T> callBack) {
		HttpEntityEnclosingRequestBase request = new HttpPost(url);
		if (params != null)
			request.setEntity(paramsToEntity(params));
		if (headers != null)
			request.setHeaders(headers);
		sendRequest(httpClient, httpContext, request, contentType, callBack);
	}

	public void post(String url, Header[] headers, HttpEntity entity,
			String contentType, AjaxCallBack<? extends Object> callBack) {
		HttpEntityEnclosingRequestBase request = addEntityToRequestBase(
				new HttpPost(url), entity);
		if (headers != null)
			request.setHeaders(headers);
		sendRequest(httpClient, httpContext, request, contentType, callBack);
	}

 同get方法一样,不同之处也在于参数。简单post方法应用:

AjaxParams params = new AjaxParams();
  params.put("username", "michael yang");
  params.put("password", "123456");
  params.put("email", "test@tsz.net");
  params.put("profile_picture", new File("/mnt/sdcard/pic.jpg")); // 上传文件
  params.put("profile_picture2", inputStream); // 上传数据流
  params.put("profile_picture3", new ByteArrayInputStream(bytes)); // 提交字节流

  FinalHttp fh = new FinalHttp();
  fh.post("http://www.yangfuhai.com", params, new AjaxCallBack(){
        @Override
        public void onLoading(long count, long current) {
                textView.setText(current+"/"+count);
        }

        @Override
        public void onSuccess(String t) {
            textView.setText(t==null?"null":t);
        }
  });

 

 这就是ainalhttp的get和post方法的应用,此外使用比较多的一个方法是download。

 

  来看download的源码:

// ---------------------下载---------------------------------------
	public HttpHandler<File> download(String url, String target,
			AjaxCallBack<File> callback) {
		return download(url, null, target, false, callback);
	}

	public HttpHandler<File> download(String url, String target,
			boolean isResume, AjaxCallBack<File> callback) {
		return download(url, null, target, isResume, callback);
	}

	public HttpHandler<File> download(String url, AjaxParams params,
			String target, AjaxCallBack<File> callback) {
		return download(url, params, target, false, callback);
	}

	public HttpHandler<File> download(String url, AjaxParams params,
			String target, boolean isResume, AjaxCallBack<File> callback) {
		final HttpGet get = new HttpGet(getUrlWithQueryString(url, params));
		HttpHandler<File> handler = new HttpHandler<File>(httpClient,
				httpContext, callback, charset);
		handler.executeOnExecutor(executor, get, target, isResume);
		return handler;
	}

 download的简单应用:

 FinalHttp fh = new FinalHttp();  
    //调用download方法开始下载
    HttpHandler handler = fh.download("http://www.xxx.com/下载路径/xxx.apk", //这里是下载的路径
    true,//true:断点续传 false:不断点续传(全新下载)
    "/mnt/sdcard/testapk.apk", //这是保存到本地的路径
    new AjaxCallBack() {  
                @Override  
                public void onLoading(long count, long current) {  
                     textView.setText("下载进度:"+current+"/"+count);  
                }  

                @Override  
                public void onSuccess(File t) {  
                    textView.setText(t==null?"null":t.getAbsoluteFile().toString());  
                }  

            });  


   //调用stop()方法停止下载
   handler.stop();

 

FinalBitmap的使用:

private static FinalBitmap mFinalBitmap;

	// //////////////////////// config method
	// start////////////////////////////////////
	private FinalBitmap(Context context) {
		mContext = context;
		mConfig = new FinalBitmapConfig(context);
		configDiskCachePath(Utils.getDiskCacheDir(context, "afinalCache")
				.getAbsolutePath());// 配置缓存路径
		configDisplayer(new SimpleDisplayer());// 配置显示器
		configDownlader(new SimpleDownloader());// 配置下载器
	}

 以上为FinalBitmap的构造器源码,代码详细信息已经注释,我们可以看出,FinalBitmap使用的是线程安全的单例模式,因此,当我们想获取一个FinalBitmap对象的时候,我们可以这样做:

 

FinalBitmap finalBitmap = FinalBitmap.create(context);

 之后可以自己去配置相关的参数:

                finalBitmap.configBitmapLoadThreadSize(3);
                //图片大小
                finalBitmap.configBitmapMaxHeight(800);
                finalBitmap.configBitmapMaxWidth(480);
                //磁盘缓存路径
                finalBitmap.configDiskCachePath("");
                finalBitmap.configDiskCacheSize(10*1024);
                //配置显示
                finalBitmap.configDisplayer(new  Displayer() {
                          
                        @Override
                        public void loadFailDisplay(View imageView, Bitmap bitmap) {
                                // TODO Auto-generated method stub
                                //设置失败 显示图片 404 等等
                        }
                          
                        @Override
                        public void loadCompletedisplay(View imageView, Bitmap bitmap,
                                        BitmapDisplayConfig config) {
                                // TODO Auto-generated method stub
                                // 加载成功  开启动画等等imageView.startAnimation();
                        }
                });
                  
                //可自己定义下载器
                finalBitmap.configDownlader(new Downloader() {
                          
                        @Override
                        public byte[] download(String urlString) {
                                // TODO Auto-generated method stub
                                //自己写下载代码。这个已经是异步操作了
                                return null;
                        }
                });
                  
                //加载时显示的图片。即默认图片
                finalBitmap.configLoadingImage(null);
                  
                //配置内存缓存大小
                finalBitmap.configMemoryCacheSize(4);
                  
                //待我后面再讲
                finalBitmap.configRecycleImmediately(true);
                finalBitmap.setExitTasksEarly(true);

 finalBitmap提供了display方法供大家调用,源码中一共有六个不同参数的dispaly方法。(大家可以去看源码)。

   下面展示一种加载网络图片的display的使用方法:

private GridView gridView;
    private FinalBitmap fb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.images);

        gridView = (GridView) findViewById(R.id.gridView);
        gridView.setAdapter(mAdapter);

        fb = FinalBitmap.create(this);//初始化FinalBitmap模块
        fb.configLoadingImage(R.drawable.downloading);
        //这里可以进行其他十几项的配置,也可以不用配置,配置之后必须调用init()函数,才生效
        //fb.configBitmapLoadThreadSize(int size)
        //fb.configBitmapMaxHeight(bitmapHeight)
    }


///////////////////////////adapter getView////////////////////////////////////////////

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView iv;
    if(convertView == null){
        convertView = View.inflate(BitmapCacheActivity.this,R.layout.image_item, null);
        iv = (ImageView) convertView.findViewById(R.id.imageView);
        iv.setScaleType(ScaleType.CENTER_CROP);
        convertView.setTag(iv);
    }else{
        iv = (ImageView) convertView.getTag();
    }
    //bitmap加载就这一行代码,display还有其他重载,详情查看源码
    fb.display(iv,Images.imageUrls[position]);

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics