天天看點

android架構學習之Volley

        Volley是一個基于HTTP協定的網絡通信架構,首先我們需要去網絡上下載下傳一個Volley的jar包,如果找不到的話,也可以在下面留下郵箱我發給你,然後我們建立一個android項目,将volley.jar複制到libs目錄就可以了,使用Volley最大的好處就是不用自己啟動子線程,我們也不需要擔心并發的問題,而且volley自帶了隊列請求機制,簡單來說我們就需要把每種請求放到隊列裡面,就可以了,你們可以将我的代碼一個點一個點的分開來看,應該還是蠻清晰的。

      因為是基于網絡的,這裡我也寫了一個網絡測試的伺服器,其實就是建立了一個伺服器,删除了一些消息,添加了一些圖檔,如果不知道伺服器如何建立的,那麼就去我之前的一片web裡面的文章看吧,如果需要源碼也可以留下郵箱。

用戶端activity

package com.jk.volleytest;

import java.util.HashMap;
import java.util.Map;

import com.android.volley.AuthFailureError;
import com.android.volley.RequestQueue;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import android.os.Bundle;
import android.app.Activity;
import android.app.DownloadManager.Request;
import android.graphics.Bitmap;
import android.text.InputFilter.LengthFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	// 聲明3個buttn分别是get請求,post請求,image請求
	Button btn_get, btn_post, btn_image;
	// 消息的隊列
	RequestQueue mQueue;
	// 圖檔
	NetworkImageView niv;
	// 圖檔的url
	String IMGurl;

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

	}

	private void init() {
		// 得到Volley的消息隊列
		mQueue = Volley.newRequestQueue(this);
		// 綁定圖檔視圖
		niv = (NetworkImageView) findViewById(R.id.show_image);
		// 綁定get按鈕
		btn_get = (Button) findViewById(R.id.btn_get);
		btn_get.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 調用getRequest請求的方法
				getRequest();
			}
		});
		// 綁定post按鈕
		btn_post = (Button) findViewById(R.id.btn_post);
		btn_post.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// 調用postRequest請求的方法
				postRequest();

			}
		});
		// 獲得擷取image請求的按鈕
		btn_image = (Button) findViewById(R.id.btn_img);
		btn_image.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// 調用獲得圖檔的方法
				getImage();

			}
		});

	}

	protected void getImage() {
		String IMGurl = "http://192.168.0.148:8080/VolletTest/anni.png";
		ImageLoader loader = new ImageLoader(mQueue, new ImageCache() {

			@Override
			public void putBitmap(String url, Bitmap bitmap) {
				// 當getBitmap裡面沒有圖檔的時候執行這個方法
			}

			@Override
			public Bitmap getBitmap(String url) {
				// 首先從這裡獲得圖檔
				return null;
			}
		});

		// 設定預設的顯示圖檔
		niv.setDefaultImageResId(R.drawable.ic_launcher);
		// 設定錯誤的顯示的圖檔
		niv.setErrorImageResId(R.drawable.ic_launcher);
		// 從網絡獲得圖檔
		niv.setImageUrl(IMGurl, loader);

	}

	protected void postRequest() {
		StringRequest posReq = new StringRequest(Method.POST,
				"http://192.168.0.148:8080/VolletTest/servlet/TestServlet",
				new Listener<String>() {

					@Override
					public void onResponse(String response) {
						Toast.makeText(MainActivity.this, response,
								Toast.LENGTH_SHORT).show();

					}
				}, new Response.ErrorListener() {

					@Override
					public void onErrorResponse(VolleyError error) {
						// TODO Auto-generated method stub
						Toast.makeText(MainActivity.this, "請求失敗",
								Toast.LENGTH_SHORT).show();
					}
				}) {
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				HashMap<String, String> parmas = new HashMap<String, String>();
				parmas.put("hello", "welcome");
				parmas.put("world", "what wrong");
				return parmas;
			}
		};
		mQueue.add(posReq);

	}

	private void getRequest() {
		StringRequest getReq = new StringRequest(Method.GET,
				"http://192.168.0.148:8080/VolletTest/servlet/TestServlet",
				new Listener<String>() {
					// 請求成功是調用的方法
					@Override
					public void onResponse(String response) {
						// 列印出伺服器傳回回來的消息
						Toast.makeText(MainActivity.this, response,
								Toast.LENGTH_SHORT).show();
					}
				}, new Response.ErrorListener() {
					// 請求失敗時傳回的方法
					@Override
					public void onErrorResponse(VolleyError error) {
						Toast.makeText(MainActivity.this, "申請錯誤",
								Toast.LENGTH_SHORT).show();

					}
				});
		// 将請求資訊添加到請求隊列
		mQueue.add(getReq);
	}

}
           

用戶端布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn_get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="get" />

    <Button
        android:id="@+id/btn_post"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="post" />

    <Button
        android:id="@+id/btn_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="btn_image" />

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/show_image"
        android:layout_width="120dp"
        android:layout_height="120dp" >
    </com.android.volley.toolbox.NetworkImageView>

</LinearLayout>
           

伺服器

package com.jk.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public TestServlet() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the GET method");
		
		out.flush();
		out.close();
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		
		out.print(this.getClass());
		out.println(", using the POST method");
		
		out.flush();
		out.close();
	}

	
	public void init() throws ServletException {
		// Put your code here
	}

}
           
android架構學習之Volley
上一篇: locale -a