(每次學習一點xamarin就做個學習筆記和視頻來加深記憶鞏固知識)
如有不正確的地方,請幫我指正。
簡介
在安卓中通過Http請求網絡數據可以使用安卓原生的HttpURLConnection類和Square公司的開源庫OKHttp3。
使用HttpURLConnection進行Get請求
直接上C#代碼吧(記得在AndroidManifest.xml文件中聲明網絡權限<uses-permissionandroid:name="android.permission.INTERNET"/>)
先定自定義個接口,裏面定義兩個回調方法
public interface IHttpListener
{
void OnFinish(string response);//請求完成後調用
void OnError(Exception e);//請求出錯後調用
}
再添加個HttpHelper類,定義下面的靜態方法
/// <summary>
/// 使用android原生的HttpURLConnection類來進行http請求
/// </summary>
/// <param name="address">請求地址</param>
/// <returns>請求得到的內容</returns>
public static void SendHttpRequest(string address, IHttpListener listener)
{
new Thread(new ThreadStart(
() =>
{
#region 子線程執行請求
HttpURLConnection conn = null;
try
{
URL url = new URL(address);
conn = (HttpURLConnection)url.OpenConnection(); //打開http連接
conn.RequestMethod = "GET"; //設置爲get請求
conn.ConnectTimeout = 6000; //設置連接超時時間爲6秒
conn.ReadTimeout = 6000; //設置讀取數據超時時間爲6秒
conn.DoInput = true; //允許接收數據,以後就可以使用conn.InputStream (Get請求時用)
//conn.DoOutput = true; //允許發送數據,以後就可以使用conn.OutputStream (Post請求時用)
StringBuilder sb = new StringBuilder();
Stream inStream = conn.InputStream;
using (StreamReader reader = new StreamReader(inStream, Encoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != null)
{
sb.Append(line);
}
}
if (listener != null)
listener.OnFinish(sb.ToString()); //回調OnFinish()方法
}
catch (Exception e)
{
if (listener != null)
listener.OnError(e); //回調OnError()方法
}
finally
{
if (conn != null)
conn.Disconnect(); //關閉連接
}
#endregion
}
)).Start();
}
使用Square.OKHttp3進行Get請求
需要從NuGet中下載此包。
/// <summary>
/// 使用Square公司開源庫OKHttp3來進行http請求
/// 需要在NuGet中下載Square.OkHttp3包
/// </summary>
/// <param name="address">請求地址</param>
/// <param name="callback">實現了ICallback接口的對象</param>
public static void SendHttpRequestByOkHttp3(string address, Square.OkHttp3.ICallback callback)
{
OkHttpClient httpClient = new OkHttpClient();
Request request = new Request.Builder()
.Url(address)
.Get()
.Build();
httpClient.NewCall(request).Enqueue(callback);//在Enqueue()方法內部自動開好子線程了
}
在Activity中分別使用這兩個方法
public class SecondActivity : AppCompatActivity, IHttpListener, Square.OkHttp3.ICallback
{
private TextView textView;
public void OnError(Exception e)//自定義接口中的回調方法
{
//必須調用RunOnUiThread()方法切換到主線程來更新UI
this.RunOnUiThread(() =>
{
Toast.MakeText(this, "請求出錯" + e.Message, ToastLength.Long).Show();
});
}
public void OnFinish(string response)//自定義接口中的回調方法
{
//必須調用RunOnUiThread()方法切換到主線程來更新UI
this.RunOnUiThread(() =>
{
textView.Text = response;
Toast.MakeText(this, "請求成功", ToastLength.Short).Show();
});
}
public void OnFailure(ICall p0, IOException p1)//OkHttp3的回調方法
{
this.RunOnUiThread(() =>
{
Toast.MakeText(this, "請求出錯" + p1.Message, ToastLength.Long).Show();
});
}
public void OnResponse(ICall p0, Response p1)//OkHttp3的回調方法
{
string s = p1.Body().String();//從響應流中讀出數據保存到變量S中
this.RunOnUiThread(() =>
{
textView.Text = s;
Toast.MakeText(this, "請求成功", ToastLength.Short).Show();
});
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Second);
textView = this.FindViewById<TextView>(Resource.Id.textView1);
Button btnSend = this.FindViewById<Button>(Resource.Id.btnSend);
btnSend.Click += delegate { HttpHelper.SendHttpRequest("http://www.hao123.com", this); };
//btnSend.Click += delegate { HttpHelper.SendHttpRequestByOkHttp3("http://www.hao123.com", this); };
}
}
完整代碼和視頻在我上傳的CSDN資源中http://download.csdn.net/download/junshangshui/10049305