Androidネットワーク接続とネットワークデータ処理


Androidネットワーク接続とネットワークデータ処理
  • HTTPリクエスト方式GETとPOST
  • Androidネットワークリクエスト
  • OkHttp
  • OKHttpライブラリを追加する依存
  • ネットワーク権限の宣言
  • 単純レイアウト
  • OkHttp具体用法

  • 同期、非同期概念
  • 同期
  • 非同期
  • 非同期方法例
  • データ解析
  • コンセプト
  • 実践
  • GsonFormatプラグインのインストール

  • HTTPリクエスト方式GETとPOST
    Android開発では、データの書き込み、データの読み取りなど、データのインタラクションに触れるため、通信間のプロトコルを使用して要求する必要があります.最も一般的なプロトコルはHTTPプロトコルですが、GETとPOSTはHTTPプロトコルで最もよく使われる2つの要求方式です.
  • HTTPプロトコルHTTP(HyperText Transfer Protocolハイパーテキスト転送プロトコル)は、クライアントとサーバが円滑に通信できるように設計されたプロトコルです.HTTPはクライアントとサーバの間でrequest-response protocol(リクエスト-返信プロトコル)で動作する.
  • GETとPOSTの違い
  • GET
    POST
    一般的にはサーバからデータを取得します
    一般的には、フォームをサーバ1にアップロードするために使用されます.
    URLが表示され、セキュリティが低い
    URLが見えず、セキュリティが高い
    コミットされたデータの長さに制限があります
    コミットされたデータの長さに制限はありません
    データキャッシュ可能
    データキャッシュ不可
    リンクURLによるパラメータ転送
    データをリクエストボディに配置して送信
    現在ではセキュリティの高いPOSTを用いて要求されているが,パスワードやその他の機密情報を送信する際にはGETは使用できないに違いない.POSTは、ブラウザ履歴やウェブサーバログにパラメータが保存されないため、GETよりも安全です.GETのデータはURLで全員に表示されています.
    Androidネットワークリクエスト
    Androidによるネットワークリクエストには、HttpURLConnection、HttpClient、OkHttpの3つの方法があります.HttpClientはAPIの数が多すぎたり、拡張が困難だったりするという欠点があるため、Android 6.0システムでは正式に廃止されている.オリジナルのHttpURLConnectionはJDKで提供されているネットワークAPIですが、ネットワーク操作は非同期やマルチスレッドに及ぶため、自分でオリジナルAPIを使って作成するのは面倒なので、実際の開発はサードパーティのネットワーク通信ライブラリを直接使用することに偏っていますが、今日紹介するOkHttpは多くのネットワーク通信ライブラリの中で最も優れているものです.
    OkHttp
    OKHttpライブラリの依存を追加
    	compile 'com.squareup.okhttp3:okhttp:3.6.0'
    

    ネットワーク権限の宣言
    	<uses-permission android:name="android.permission.INTERNET"/>
    

    安全でないhttpリンクを使用している場合は、インベントリファイルに宣言する必要があります.
    	android:usesCleartextTraffic="true"
    

    単純レイアウト
    <Button
            android:id="@+id/btn_request"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="    "/>
    
        <Button
            android:id="@+id/btn_jump"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="     "/>
    
    
        <TextView
            android:id="@+id/tv_data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    

    OkHttp具体的な使い方
  • OkHttpClient
  • を定義し、インスタンス化する
    	OkHttpClient client = new OkHttpClient();
    
  • は、HTTP要求を開始するためにRequestオブジェクトを作成し、url()メソッドによってターゲットのネットワークアドレスを設定する.
  • 	Request request = new Request.Builder()
    	.url("http://106.53.96.124/wanted/public/index.php/index/article/find")
    	.build();
    
  • OkHttpClientのnewCall()メソッドを呼び出してCallオブジェクトを作成し、execute()メソッドを呼び出してリクエストを送信し、応答データを取得します.
  • は、取得した応答データを受信するためにresponseオブジェクトを定義し、responseDataによって返される具体的な内容を取得する.
  •  	Response response = client.newCall(request).execute();
    	String responseData = response.body().string();
    
  • は、ネットワーク要求が時間のかかる動作であるため、サブスレッドで実行されるべきである.したがって、クリックイベントを設定するときは、onClick()メソッドで新しいサブスレッドを開く必要があります.例:
  • btn_request.setOnClickListener(new View.OnClickListener() {
         
                @Override
                public void onClick(View v) {
         
                    new Thread(new Runnable() {
         
                        @Override
                        public void run() {
         
                            sendRequestWithOkHttp();//        1-4    
                        }
                    }).start();
                }
            });
    
  • sendRequestWithOkHttp()メソッドの詳細は、次のとおりです.
  • private void sendRequestWithOkHttp(){
         
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("http://106.53.96.124/wanted/public/index.php/index/article/find")
                    .build();
            //try catch      
            try {
         
            //    
                Response response = client.newCall(request).execute();
                String responseData = response.body().string();
                //                 ,                     Ui      
                runOnUiThread(new Runnable() {
         
                    @Override
                    public void run() {
         
                        tv_data.setText(responseData);
                    }
                });
            }catch (Exception e){
         
                e.printStackTrace();
            }
    }
    

    同期、非同期の概念
    同期
    同期メソッド呼び出しが開始されると、呼び出し元は、後続の動作を継続するためにメソッド呼び出しが返されるまで待たなければなりません.サブスレッドがプライマリ・スレッドに通知されるまで、現在のプライマリ・スレッドがブロックされます.(要求の発行→サーバ処理待ち→処理完了後に戻る)
    非同期
    非同期メソッド呼び出しは、通常、別のスレッドで実行されます.プロセス全体が、呼び出し元の作業を阻害しません.プライマリ・スレッドは、インタフェース・コールバックやメッセージ・キューのような考えで、サブスレッドがタスクを完了したときにプライマリ・スレッドに通知すれば、他のことを続けることができます.(リクエストはイベントトリガ>サーバ処理(待つ必要がなく、プライマリ・スレッドは別のことができる)>処理済み)のどちらかで、非同期メソッドを使用してネットワーク・リクエストを行うことを推奨します.
    非同期メソッドの例
    Callオブジェクトを定義し、requestをcallに渡し、call呼び出し.enqueue()メソッドで実行します.Enqueue()メソッドにCallbackインタフェースの匿名実装クラス(onFailure()メソッドとonRresponse()メソッドを含む)を渡す必要があります.非同期リスニング方法の例を次に示します.
    private void sendRequestWithOkHttp(){
         
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("http://106.53.96.124/wanted/public/index.php/index/article/find")
                    .build();
            //      
            Call call = client.newCall(request);
            call.enqueue(new Callback() {
         
                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {
         
                    e.printStackTrace();
                }
    
                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
         
                    String jsonData = response.body().string();
                    //	      UI  
                    runOnUiThread(new Runnable() {
         
                        @Override
                        public void run() {
         
                            tv_data.setText(jsonData);
                        }
                    });
                }
            });
    	}
    

    データ解析
    コンセプト
    一般に,ネットワークリクエストにより取得されるデータは,xml形式データ,Json形式データなど多くある.私たちがネットワークリクエストで取得したデータはJson形式のデータです.たとえば
    {
         "name":"alex","age":"18","friends":[{
         "name":"Amy","age":"19"},{
         "name":"Jack","age":"18"}]}
    

    以上の{}は1つのクラスのインスタンスに相当し,[{},{}]は2つのクラスからなる配列に相当し,2つのクラスのインスタンスを含む.
    じっこう
  • Gsonライブラリの依存
  • を追加
        implementation 'com.google.code.gson:gson:2.7'
    
  • BaseResponseベースクラスを新規作成し、サービス側から取得したデータを受信します.クラスの内容はGsonformatプラグインでインポートできます.alt+sはプラグインインタフェースを呼び出し、json形式のデータをコピーし、OKをクリックします.
  • parseJSOnWithGSON()メソッド
  • を作成
    private void parseJSONWithGSON(){
         
            Gson gson = new Gson();
            //           Json        ,      TypeToken             fromJson()   
            BaseResponse<List<BaseResponse.Article>> baseResponse = gson.fromJson(jsonData,new TypeToken<BaseResponse<List<BaseResponse.Article>>>(){
         }.getType());
            List<BaseResponse.Article> articleList = baseResponse.getData();
            Log.d("code", "code is " + baseResponse.getCode());
            Log.d("msg", "msg is " + baseResponse.getMsg());
            for (BaseResponse.Article article:articleList){
         
                Log.d("Data", "id is "+article.getId());
                Log.d("Data", "title is "+article.getTitle());
                Log.d("Data", "content is "+article.getContent());
                Log.d("Data", "tags is "+article.getTags());
                Log.d("Data", "create_time is "+article.getCreate_time());
                Log.d("Data", "writer is "+article.getWriter());
                Log.d("Data", "images is "+article.getImages());
                Log.d("Data", "photo is "+article.getPhoto());
                Log.d("Data", "like_number is "+article.getLike_number());
                Log.d("Data", "comment_number is "+article.getComment_number());
            }
        }
    
  • クリックイベントOnClick()メソッドでparseJSOnWithGSON()メソッドを呼び出します.
  • btn_show.setOnClickListener(new View.OnClickListener() {
         
                @Override
                public void onClick(View v) {
         
                    if (jsonData==null){
         
                        Toast.makeText(MainActivity.this,"    ",Toast.LENGTH_SHORT).show();
                    }
                    else parseJSONWithGSON();
                }
            });
    

    GsonFormatプラグインのインストール
    File→setting→plugin→Marketplace、gsonformat/Sgsonformat/gsonfromatplusを検索し、alt+insertでgsonformatプラグインを呼び出し、jsonフォーマットデータをコピーしてokをクリックします.
    インタフェースのテスト:https://getman.cn/インタフェースドキュメント:http://www.docway.net/
    参考資料:Android入門のHttpリクエスト方式GetとPostの同期と非同期の区別同期(Synchronous)と非同期(Asynchronous)
    一般的にフォーム(データセット)をサーバにアップロードし、サーバが処理してからクライアントにデータを返します.↩︎