1:Buddle。不是持久化
2:sharedpreshared:是持久化的。一般用于小型数据。
3:sqlite:数据库,用于数据量较大的持久化数据。
4:sdcard。
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); } }); } }