AsyncTaskを利用した通信を利用して、カレンダーを作ってみよう。
今回はカレンダーAPIを提供してくれている以下のサイトをご利用させていただく。
カレンダーネット
http://calendar-service.net/
上記サイトに
http://calendar-service.net/cal?start_year=2017&start_mon=1&end_year=2017&end_mon=12&year_style=normal&month_style=ja&wday_style=ja&format=csv
のリクエストを投げると
年,月,日,年号,和暦,曜日,曜日番号,祝日名 2017,1,1,平成,29,日,0,元日 2017,1,2,平成,29,月,1,振替休日 2017,1,3,平成,29,火,2, 2017,1,4,平成,29,水,3, 2017,1,5,平成,29,木,4, 略
というカレンダーのCSVデータをレスポンスとして受け取れる。(レスポンスの文字コードはEUC-JP)
このデータを利用してリストビューでカレンダーを作ってみよう。なお通信中はプログレスバーを使って通信していることをユーザーに伝えること。
[実行例]
●スタート画面
●取得ボタンを押すと通信を開始し通信が終わるとリストビューが表示される。
[作例]
●AndroidManifest.xml(uses_permissionの1行を挿入する)
<uses-permission android:name="android.permission.INTERNET"/>
●activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <ProgressBar android:id="@+id/pb" style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Small" android:layout_width="0dp" android:layout_height="wrap_content" android:visibility="gone" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="8dp" android:layout_marginLeft="8dp" /> <Button android:id="@+id/button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="7dp" android:onClick="btClick" android:text="取得" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/pb" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" /> <ListView android:id="@+id/lv" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/button" android:layout_marginLeft="8dp" app:layout_constraintLeft_toLeftOf="parent" android:layout_marginRight="8dp" app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="8dp" /> </android.support.constraint.ConstraintLayout>
●MyTask.java
import android.content.Context; import android.os.AsyncTask; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.ProgressBar; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; public class MyTask extends AsyncTask<String,Void,List<String>> { private ListView lv; private ArrayAdapter<String> adapter; private ProgressBar pb; private List<String> list; private Context c; public MyTask(Context c){ this.c=c; MainActivity activity=(MainActivity)c; lv=(ListView)activity.findViewById(R.id.lv); pb=(ProgressBar)activity.findViewById(R.id.pb); } @Override protected void onPreExecute() { pb.setVisibility(ProgressBar.VISIBLE); list=new ArrayList<>(); } @Override protected void onPostExecute(List<String> list) { adapter=new ArrayAdapter<>(c,android.R.layout.simple_list_item_1,list); lv.setAdapter(adapter); pb.setVisibility(ProgressBar.GONE); } @Override protected List<String> doInBackground(String... params) { try { URL url=new URL(params[0]); HttpURLConnection con=(HttpURLConnection)url.openConnection(); con.setRequestMethod("GET"); InputStream is=con.getInputStream(); InputStreamReader isr=new InputStreamReader(is,"EUC-JP"); BufferedReader br=new BufferedReader(isr); String line; while((line=br.readLine()) != null){ if(line.startsWith("年")){ continue; } //第二引数負で最後のデータが空でも空文字として取得する String[] data=line.split(",",-1); //年,月,日,年号,和暦,曜日,曜日番号,祝日名 String str=String.format("%s月%s日(%s) %s",data[1],data[2],data[5],data[7]); list.add(str); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return list; } }
●MainActivity.java
package com.example.mjpurin.calendarapp; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void btClick(View v){ MyTask mt=new MyTask(this); mt.execute("http://calendar-service.net/cal?start_year=2017&start_mon=1&end_year=2017&end_mon=12&year_style=normal&month_style=ja&wday_style=ja&format=csv"); } }
コメント