Computer >> 컴퓨터 >  >> 문제 해결 >> Android

Android 앱에 API 가져오기를 포함하는 방법

앱 개발자라면 사용자에게 제공하기 위해 데이터를 가져오는 웹 API를 포함하고 싶을 때가 있습니다. 그다지 어렵지 않으며 XML 또는 JSON으로 수행할 수 있습니다. 따라서 이 튜토리얼에서는 Android 앱에 간단한 Web API 데이터 가져오기 프로그램을 빌드하는 방법을 보여 드리겠습니다.

이 자습서에서는 XML 대신 JSON을 사용합니다.

JSON으로 코드 작성

먼저 다음 코드를 사용하여 새 목록 보기 XML 파일을 만듭니다.

 다음으로 새 XML 파일을 만듭니다. , 그리고 여기에 표시하려는 요소(ImageView, TextView 등)

API에서 데이터를 가져오기 위해서는 메인 액티비티로 이동해야 하며, 메인 스레드에서는 API 페칭이 불가능하기 때문에 AsyncTask를 사용해야 합니다. AsyncTask는 단순히 UI에 결과를 표시하면서 백그라운드 프로세스를 수행하는 스레드입니다. 네트워크 프로세스에 기본 스레드를 사용하면 일반적으로 앱이 충돌합니다. 조금 혼란스럽게 들린다면 RapidAPI에 대한 심층적인 API 자습서를 확인하세요.

Class DownloadFilesTask extends AsyncTask {private final ProgressDialog dialog =new ProgressDialog(MainActivity.this);@Overrideprotected void onPreExecute(){super.onPreExecute();this.dialog.setMessage("로그인 ...");this.dialog.show();}@Overrideprotected String doInBackground(Void...params){ServiceHandler sh =new ServiceHandler();String jsonStr =sh.makeServiceCall("https://jsonplaceholder.typicode .com/albums/", ServiceHandler.GET);Log.d("res1", jsonStr);return jsonStr;}@Overrideprotected 무효 onPostExecute(문자열 응답){super.onPostExecute(응답);Log.d("res2" , 응답);dialog.dismiss();if(응답 !=null){try{JSONArray arr =new JSONArray(response);DataModel mDatModel =new DataModel();for (int i =0, i  id_array =new ArrayList  ();ArrayList  notice_array =new ArrayList  ();Button b1;ListView l;private final static String SERVICE_URI ="https://jsonplaceholder.typicode.com/albums/"; private static final String TAG_QUESTIONS ="Questions"; private static final String USER_ID ="userId"; private static final String ID ="id"; private static final String TITLE ="title";JSONArray 질문 =null;protected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState);}보호된 무효 onRestoreInstanceState(SavedInstanceState 번들){super.onRestoreInstanceState(savedInstanceState);}@Overrideprotected 무효 onCreate(SavedInstanceState 번들){super.onCreate(savedInstanceState);setContentView(R.layout.activi ty_main);l =(ListView) findViewById(R.id.list);new DownloadFilesTask().execute();l.setOnItemClickListener(new AdapterView.OnItemClickListener(){@Overridepublic 무효 onItemClick(AdapterView  부모, 뷰 보기, int 위치, 긴 id){String abc =id_array.get(position);Toast.makeText(getBaseContext(), id_array.get(position), Toast.LENGTH_LONG).show();Intent n =new Intent(MainActivity.this, Titleshow.class);n.putExtra("id", id_array.get(position));startActivity(n);}});}@Overridepublic void onItemClick(AdapterView  부모, 보기 보기, int 위치, 긴 ID){}

주요 활동에서 응답을 찾을 수 있습니다.

ServiceHandler sh =new ServiceHandler();String jsonStr =sh.makeServiceCall("https://jsonplaceholder.typicode.com/albums/", ServiceHandler.GET); 이것은 요청하고 가져오기 위한 서비스 핸들 클래스일 뿐입니다. web api에서 respose하여 web api.ServiceHandler.javaclass ServiceHandler{static String response =null;public final static int GET =1;public final static int POST =2;public ServiceHandler(){}/** * 서비스 호출하기** @url - 요청할 url* @method - http 요청 메소드*/public String makeServiceCall(String url, int method){return this.makeServiceCall(url, method, null);}/*** 서비스 호출** @url - 요청할 url* @method - http 요청 메서드* @params - http request params*/public String makeServiceCall(String url, int method, List  params){try{// http clientDefaultHttpClient httpClient =new DefaultHttpClient();HttpEntity httpEntity =null;HttpResponse httpResponse =null;// http 요청 메소드 type 확인 if (method ==POST){HttpPost httpPost =new HttpPost(url);// 포스트 추가 paramsif (params !=null){httpPost.setEntity(new UrlEncodedFormEntity(params));}httpResponse =httpClient.execute(httpPost);}else if (메소드 ==GET){// urlif에 매개변수 추가(params !=null){String paramString =URLEncodedUtils.format(params, "utf-8");url +="?" + paramString;}HttpGet httpGet =new HttpGet(url);httpResponse =httpClient.execute(httpGet);}httpEntity =httpResponse.getEntity();response =EntityUtils.toString(httpEntity);}catch(UnsupportedEncodingException e){e.printStackTrace ();}catch(ClientProtocolException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}반환 응답;}}

다음으로 asyncTask에서 어댑터 메서드를 설정하는 어댑터 클래스를 찾을 수 있지만 이를 위해 사용자 지정 어댑터를 만들어야 합니다.

public class AAdapter extends BaseAdapter{private Activity activity;// private ArrayList> data;private static ArrayList title; private static LayoutInflater inflater =null; public AAdapter(Activity a, ArrayList b){activity =a;this.title =b;inflater =(LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}public int getCount(){return title.size();}public Object getItem(int position){return position;} public long getItemId(int position){return position;}public View getView(int position, View convertView, ViewGroup parent){View vi =convertView;if(convertView ==null) vi =inflater.inflate(R.layout.abcd, null);TextView title2 =(TextView) vi.findViewById(R.id.txt_ttlsm_row); // titleString 노래 =title.get(위치).toString();title2.setText(노래);TextView title22 =(TextView) vi.findViewById(R.id.txt_ttlcontact_row2); // noticeString song2 =title.get(position).toString();title22.setText(song2);return vi;}}

어댑터 클래스는 Android에서 추상 클래스로 간주되므로 모든 메서드를 구현해야 함을 기억해야 합니다. 아래 코드에서 getview 메소드가 중요합니다. 두 번째 XML 파일을 표시하기 위해 더 많은 코드를 추가할 것이기 때문입니다.

inflater =(LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

또한 API 페처가 인터넷에서 이미지를 로드할 수 있도록 Load Image용 어댑터 클래스도 필요합니다.

공개 클래스 MyAdapter extends BaseAdapter{ImageLoader imageLoader;private Context ctx;ArrayList  list;public MyAdapter(Context ctx, ArrayList  mDataList){list =mDataList;this.ctx =ctx;}public int getCount( ){return list.size();}public Object getItem(int position){return position;}public long getItemId(int position){return position;}public View getView(int position, View convertView, ViewGroup 부모){// 보기 vi =convertView;ViewHolder viewHolder;if (convertView ==null){LayoutInflater vi =(LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);convertView =vi.inflate(R.layout.abcde, null);viewHolder =새로운 ViewHolder ();viewHolder.imageView =(ImageView) convertView.findViewById(R.id.image);viewHolder.textView =(TextView) convertView.findViewById(R.id.txt_ttlsm_row);convertView.setTag(viewHolder);}else{viewHolder =(ViewHolder) convertView.getTag();}앨범 데이터 데이터 =list.get(위치);문자열 a =data.getThumbnailUrl();if(데이터 !=null){ viewHolder.textView.setText(data.getTitle());문자열 url =a;Glide.with(ctx).load(url).centerCrop().placeholder(R.drawable.abhi).crossFade().into(viewHolder .imageView);/* Picasso.with(ctx).load("https://preview.keenthemes.com/conquer/assets/plugins/jcrop/demos/demo_files/image2.jpg").into(viewHolder.imageView);*//* ImageLoader imageLoader =ImageLoader.getInstance();imageLoader.displayImage("https://www.keenthemes.com/preview/conquer/assets/plugins/jcrop/demos/demo_files/image1.jpg", viewHolder. imageView);*/}return convertView;}공개 클래스 ViewHolder{ImageView imageView;TextView textView;}

강력한 오픈 소스 이미지 다운로더 및 Android용 캐싱 라이브러리인 Picasso 이미지 로더에 대한 제안일 뿐이며 앱에 가벼운 공간을 유지하는 코드 주석을 추가했습니다. 그러나 Glide 이미지 로더를 사용하여 GIF 지원 및 더 나은 메모리 관리를 제공하므로 더 많은 사용자 정의를 할 수도 있습니다.

공개 클래스 ViewHolder{ImageView imageView;TextView textView;}

뷰 홀더 클래스가 하는 일은 ViewHolder의 정적 인스턴스를 만든 다음 처음 로드할 때 뷰 항목에 연결하는 것입니다. 그런 다음 향후 호출에서 view 태그에서 검색됩니다.

getView() 메서드는 ListView에 요소가 많을 때와 같이 많이 호출됩니다. 그래서 우리는 배열 목록의 요소를 얻는 데 도움이 되는 set 및 get 메서드에 대한 데이터 모델 클래스를 구현하고 앞으로의 삶을 더 쉽게 만들 것입니다.

public class AlbumData{int albumId;int id;String title;String url;String thumbnailUrl;public int getAlbumId(){return albumId;}public void setAlbumId(int albumId){this.albumId =albumId;}public int getId (){반환 ID;}공개 무효 setId(int ID){this.id =ID;}공개 문자열 getTitle(){반환 제목;}공개 무효 setTitle(문자열 제목){this.title =제목;}공개 문자열 getUrl (){반환 URL;}공개 무효 setUrl(문자열 URL){this.url =url;}공개 문자열 getThumbnailUrl(){반환 thumbnailUrl;}공개 무효 setThumbnailUrl(문자열 축소판Url){this.thumbnailUrl =thumbnailUrl;}} 

그것이 지금 필요한 모든 것입니다. BlueStacks와 같은 앱 에뮬레이터에서 이 API 페처의 출력을 테스트할 수 있습니다.