xamarin學習筆記A15(安卓OkHttp3和HttpURLConnection) 上

(每次學習一點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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章