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;@Overrideprotected 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() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubswitch (msg.what) {case 0:String string = (String) msg.obj;textView.setText(string);break;default:break;}}};Runnable my = new Runnable() {@Overridepublic 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 blocke.printStackTrace();} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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"); *  * } }); */}@Overridepublic 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;}@Overridepublic 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);            }        });    }}





更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 《Android开发从零开始》——25.数据存储(4)
  4. Android系统配置数据库注释(settings.db)
  5. Android中不同应用间实现SharedPreferences数据共享
  6. Android使用Retrofit进行网络请求
  7. android图表ichartjs
  8. Android内容提供者源码
  9. android SharedPreferences

随机推荐

  1. MySQL数据归档小工具mysql_archiver详解
  2. 详解MySQL 数据分组
  3. 详解mysql 组合查询
  4. Mysql优化神器(推荐)
  5. 修改MySQL数据库引擎为InnoDB的操作
  6. MySQL按小时查询数据,没有的补0
  7. MySQL修改账号密码方法大全(小结)
  8. Ubuntu 20.04 安装和配置MySql5.7的详细
  9. 如何安全地关闭MySQL
  10. MySQL修改密码的几种方式