android 通过http访问服务器数据

android 访问数据有一下几种方式:

1:Buddle。不是持久化

2:sharedpreshared:是持久化的。一般用于小型数据。

3:sqlite:数据库,用于数据量较大的持久化数据。

4:sdcard。

5:http:服务器数据访问。

主要介绍一下第5个:http。

http:访问我知道的有一下几种方法:

1.直接通过url链接服务器,通过url.openStream()来获得输入流InputStream。

这种方法要新建线程,不能直接在主线程ui中实用。

* 创建handler。

* 创建runnable。启动线程thread.start

* 在runnable中重新run,获取输入流InputStream。

通过url调用本地web服务器一张图片。注意android访问本地服务器的地址:10.0.2.2不是127.0.0.1

 package com.example.test;

import java.io.InputStream;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private ImageView imageView;
    String resultString = "";
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Handler handler;
        imageView = (ImageView) findViewById(R.id.show);

        /* handler 主要 */
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                
                switch (msg.what) {
                case 0:
                    Bitmap bitmap = (Bitmap) msg.obj;
                    imageView.setImageBitmap(bitmap);
                    break;        

                default:
                    break;
                }

            }

        };
        /* runnable接口  主要*/
        Runnable my = new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = null;
                URL url;

                try {
                    url = new URL(
                            "http://10.0.2.2:8080/hello/source/image/2.jpg");
                    InputStream is = url.openStream();
                    bitmap = BitmapFactory.decodeStream(is);
                    is.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {

                }

                Message msg = new Message();
                msg.what = 0;
                msg.obj = bitmap;
                handler.sendMessage(msg);

            }
        };
     /*主要*/
        Thread thread = new Thread(my);
        thread.start();

    }

    @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, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

2.通过Java的HttpURLConnection和Apache的HttpClient。

他们之间的用法基本一样。HttpClient是HttpURLConnection的更高版本,HttpURLConnection能实现的功能,httpclient都能实现。httpclient有些功能HttpURLConnection不能实现。如一些需要登录的页面数据HttpURLConnection不能直接访问得到数据,而httpclient可以直接。这点如果不明白,可以先看一下李刚的《疯狂android讲义》有说明。但是好像google更推荐实用HttpURLConnection。可以看一下这里:http://blog.csdn.net/huzgd/article/details/8712187

HttpClient的基本用法:

HttpClient client 生成一个http客户端发送请求对象

HttpPost和HttpGet请求方式

httpResponse = client.execute(httpPost)  发出请求并得到结果


HttpEntity entity = httpResponse.getEntity();  获取响应里面的内容

entity.tostring 得到字符串。


package com.example.test1;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.R.string;
import android.content.Entity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.HttpGet;

public class MainActivity extends ActionBarActivity {
	TextView textView;
	ImageView imageView;
	Handler handler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageView = (ImageView) findViewById(R.id.imageView1);
		textView = (TextView)findViewById(R.id.textView1);
		handler = new Handler() {

			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				switch (msg.what) {
				case 0:
					String string = (String) msg.obj;
					textView.setText(string);
					break;

				default:
					break;
				}
			}

		};

		Runnable my = new Runnable() {

			@Override
			public void run() {
				Message msg = new Message();
				msg.what = 0;
				

				try {
					String url = "http://10.0.2.2:8080/hello/test.json";
					HttpGet request = new HttpGet(url);
					DefaultHttpClient client = new DefaultHttpClient();
					HttpResponse response = client.execute(request);
					String string  = EntityUtils.toString(response.getEntity(), "gbk");	
					msg.obj = string;
					handler.sendMessage(msg);
				} catch (ClientProtocolException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				

			}
		};
		Thread thread = new Thread(my);
		thread.start();

		/*
		 * TwitterRestClient.get("image/2.jpg", null, new
		 * AsyncHttpResponseHandler() {
		 * 
		 * @Override public void onRetry(int retryNo) { // TODO Auto-generated
		 * method stub super.onRetry(retryNo); }
		 * 
		 * @Override public void onStart() { // TODO Auto-generated method stub
		 * super.onStart();
		 * 
		 * }
		 * 
		 * @Override public void onSuccess(int arg0, Header[] arg1, byte[] arg2)
		 * {
		 * 
		 * Bitmap bitmap = BitmapFactory.decodeByteArray(arg2, 0, arg2.length);
		 * imageView.setImageBitmap(bitmap); }
		 * 
		 * @Override public void onFailure(int arg0, Header[] arg1, byte[] arg2,
		 * Throwable arg3) { Log.v("http", "ERROR");
		 * 
		 * } });
		 */
	}

	@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, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
3.上两种可以多看看别人的博客就可以完成了。还有一种更简单及时第三方库android-async-http。只需两部就可以了。


一,创建请求对象

AsyncHttpClient client = new AsyncHttpClient();
二。选择方式访问 get、put、post、head、delete



client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override public void onSuccess(String response) {
        System.out.println(response);
    }
});
很简单吧。这里不用创建线程,直接用就可以了。




AsyncHttpClient client = new AsyncHttpClient();
client.get("https://www.baidu.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
	}
});
一般需要重写onsuccess方法。 官方文档很详细还有一篇 博客也很好。

官方推荐了一种静态方法,感觉他更方便访问数据,只要你把资源名就行了。

1.先把原来的方法和路径包装起来:

import com.loopj.android.http.*;

public class TwitterRestClient {
  private static final String BASE_URL = "https://api.twitter.com/1/";

  private static AsyncHttpClient client = new AsyncHttpClient();

  public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
      client.get(getAbsoluteUrl(url), params, responseHandler);
  }

  public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
      client.post(getAbsoluteUrl(url), params, responseHandler);
  }

  private static String getAbsoluteUrl(String relativeUrl) {
      return BASE_URL + relativeUrl;
  }
}
在按原来的方法实用,只是要用上面的包装类

import org.json.*;
import com.loopj.android.http.*;

class TwitterRestClientUsage {
    public void getPublicTimeline() throws JSONException {
        TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                // If the response is JSONObject instead of expected JSONArray
            }
            
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
                // Pull out the first event on the public timeline
                JSONObject firstEvent = timeline.get(0);
                String tweetText = firstEvent.getString("text");

                // Do something with the response
                System.out.println(tweetText);
            }
        });
    }
}





你可能感兴趣的:(android,通过http,《疯狂android讲义》)