Computer >> คอมพิวเตอร์ >  >> การแก้ไขปัญหา >> Android

วิธีรวม API Fetcher ในแอพ Android ของคุณ

หากคุณเป็นนักพัฒนาแอป อาจมีบางครั้งที่คุณต้องการรวมเว็บ API เพื่อดึงข้อมูลเพื่อให้ผู้ใช้ของคุณ ไม่ยากอย่างยิ่ง และสามารถทำได้ทั้งในรูปแบบ XML หรือ JSON ดังนั้นในบทช่วยสอนนี้ เราจะแสดงให้คุณเห็นถึงวิธีสร้างตัวดึงข้อมูล API เว็บอย่างง่ายในแอป Android ของคุณ

สำหรับบทแนะนำนี้ เราจะใช้ JSON แทน XML

การเขียนโค้ดใน JSON

ขั้นแรกให้สร้างไฟล์ XML มุมมองรายการใหม่ โดยใช้รหัสต่อไปนี้:

 ถัดไปให้สร้างไฟล์ XML ใหม่ และนี่คือที่ที่คุณจะแสดงรายการองค์ประกอบที่คุณต้องการแสดง (ImageView, TextView ฯลฯ)

ในการดึงข้อมูลจาก API เราจะต้องไปที่กิจกรรมหลัก และเราจำเป็นต้องใช้ AsyncTask เนื่องจากไม่สามารถดึงข้อมูล API บนเธรดหลักได้ AsyncTask เป็นเพียงเธรดที่ทำกระบวนการพื้นหลัง ในขณะที่แสดงผลลัพธ์ใน UI การใช้เธรดหลักสำหรับกระบวนการเครือข่ายมักจะทำให้แอปของคุณขัดข้อง หากฟังดูสับสน โปรดดูบทแนะนำเกี่ยวกับ API เชิงลึกใน RapidAPI

คลาส DownloadFilesTask ขยาย AsyncTask {กล่องโต้ตอบ ProgressDialog สุดท้ายส่วนตัว =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 void onPostExecute(String response){super.onPostExecute(response);Log.d("res2" , การตอบสนอง);dialog.dismiss();if (การตอบสนอง !=null){try{JSONArray arr =new JSONArray(response);DataModel mDatModel =new DataModel();for (int i =0; i  id_array =ใหม่ ArrayList <สตริง> (); ArrayList <สตริง> Notice_array =ใหม่ ArrayList <สตริง> (); ปุ่ม b1; ListView l; สตริงคงที่ส่วนตัวสุดท้าย SERVICE_URI ="https://jsonplaceholder.typicode.com/albums/"; สตริงสุดท้ายคงที่ส่วนตัว TAG_QUESTIONS ="คำถาม";สตริงสุดท้ายคงที่ส่วนตัว USER_ID ="userId";ID สตริงสุดท้ายคงที่ส่วนตัว ="id";สตริงสุดท้ายคงที่ส่วนตัว TITLE ="ชื่อ";คำถาม JSONArray =null; โมฆะที่ได้รับการป้องกัน onSaveInstanceState (มัด) outState){super.onSaveInstanceState(outState);} โมฆะที่ได้รับการป้องกัน onRestoreInstanceState (บันเดิลที่บันทึกไว้InstanceState){super.onRestoreInstanceState(savedInstanceState);}@Overrideprotected ถือเป็นโมฆะ onCreate (บันเดิลที่บันทึกไว้ที่InstanceState){super.onState. ty_main);l =(ListView) findViewById(R.id.list);new DownloadFilesTask().execute();l.setOnItemClickListener(new AdapterView.OnItemClickListener(){@Overridepublic void onItemClick(AdapterView  parent, ดูมุมมอง, ตำแหน่ง 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  parent, ดู ดู, ตำแหน่ง int, รหัสยาว){}

คุณจะพบคำตอบในกิจกรรมหลักของคุณ

ServiceHandler sh =new ServiceHandler();String jsonStr =sh.makeServiceCall("https://jsonplaceholder.typicode.com/albums/", ServiceHandler.GET) ไม่มีอะไรนอกจากคลาสตัวจัดการบริการที่จะร้องขอและรับ ตอบกลับจาก web api ดังนั้นเราจะทำทั้งหมดนี้จากเว็บ 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 ขอ params*/public String makeServiceCall(String url, int method, List  params){try{// http clientDefaultHttpClient httpClient =ใหม่ DefaultHttpClient();HttpEntity httpEntity =null;HttpResponse httpResponse =null;// กำลังตรวจสอบวิธีการขอ HTTP typeif (เมธอด) ==POST){HttpPost httpPost =new HttpPost(url);// เพิ่ม post paramsif (params !=null){httpPost.setEntity(new UrlEncodedFormEntity(params));}httpResponse =httpClient.execute(httpPost);}else if (เมธอด ==GET){// ต่อท้าย params กับ urlif (params !=null){String paramString =URLEncodedUtils.format(params, "utf-8");url +="?" + paramString;}HttpGet httpGet =ใหม่ 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 ของคุณ คุณจะพบคลาส Adapter ซึ่งจะตั้งค่าวิธีอะแดปเตอร์ แต่สำหรับสิ่งนี้ เราจำเป็นต้องสร้างอะแดปเตอร์ที่กำหนดเอง

คลาสสาธารณะ AAdapter ขยาย BaseAdapter{กิจกรรมกิจกรรมส่วนตัว;// ArrayList ส่วนตัว> data;ชื่อ ArrayList แบบคงที่ส่วนตัว; ตัวเติมอากาศ LayoutInflater แบบคงที่ส่วนตัว =null; AAdapter สาธารณะ (กิจกรรม a, ArrayList b){กิจกรรม =a;this.title =b;inflater =(LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);} public int getCount(){return title.size();}วัตถุสาธารณะ getItem(ตำแหน่ง int){ตำแหน่งกลับ;} getItemId สาธารณะแบบยาว (ตำแหน่ง int){return position;}public View getView (ตำแหน่ง int, 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(song);TextView title22 =(TextView) vi.findViewById(R.id.txt_ttlcontact_row2); // noteString song2 =title.get(position).toString();title22.setText(song2);return vi;}}

เราต้องจำไว้ว่าคลาสอะแด็ปเตอร์ถือเป็นคลาสนามธรรมใน Android ดังนั้นเราจึงต้องใช้วิธีการทั้งหมด ในโค้ดด้านล่าง วิธี getview มีความสำคัญ เนื่องจากเราจะเพิ่มโค้ดเพิ่มเติมเพื่อแสดงไฟล์ XML ไฟล์ที่สอง

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

และเราจำเป็นต้องมีคลาส Adapter สำหรับ Load Image เพื่อให้ตัวดึงข้อมูล API สามารถโหลดรูปภาพจากอินเทอร์เน็ตได้

คลาสสาธารณะ MyAdapter ขยาย BaseAdapter{ImageLoader imageLoader;private Context ctx;ArrayList  list; MyAdapter สาธารณะ (บริบท ctx, ArrayList  mDataList){list =mDataList;this.ctx =ctx;}public int getCount( ){return list.size();}public Object getItem(ตำแหน่ง int){return position;}public long getItemId(int position){return position;}public View getView(int position, View convertView, ViewGroup parent){// ดู 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);} อื่น ๆ {viewHolder =(ViewHolder) convertView.getTag();}AlbumData data =list.get(position);String a =data.getThumbnailUrl();if (data !=null){ viewHolder.textView.setText(data.getTitle());String 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);*/}ส่งคืน convertView;}ViewHolder คลาสสาธารณะ{ImageView imageView;TextView textView;}

เราได้เพิ่มความคิดเห็นเกี่ยวกับโค้ดที่เป็นเพียงคำแนะนำสำหรับตัวโหลดรูปภาพของ Picasso ซึ่งเป็นตัวดาวน์โหลดรูปภาพโอเพนซอร์ซอันทรงพลังและไลบรารีแคชสำหรับ Android และทำให้แอปของคุณมีขนาดเล็กลง อย่างไรก็ตาม คุณยังสามารถใช้ตัวโหลดรูปภาพ Glide เพื่อปรับแต่งได้มากขึ้น เนื่องจากรองรับ GIF และการจัดการหน่วยความจำที่ดีขึ้น

ViewHolder คลาสสาธารณะ{ImageView imageView;TextView textView;}

สิ่งที่คลาสผู้ถือมุมมองทำคือสร้างอินสแตนซ์คงที่ของ ViewHolder แล้วแนบกับรายการมุมมองเมื่อโหลดครั้งแรก จากนั้นจะดึงข้อมูลจากแท็กมุมมองในการโทรในอนาคต

เมธอด getView() ถูกเรียกเป็นจำนวนมาก เช่น เมื่อมีองค์ประกอบจำนวนมากใน ListView ดังนั้น เราจะใช้คลาสโมเดลข้อมูลสำหรับ set and get method ซึ่งจะช่วยให้คุณได้รับองค์ประกอบของรายการอาร์เรย์ และทำให้ชีวิตของคุณง่ายขึ้นในอนาคต

คลาสสาธารณะ 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 (){return id;}public void setId(int id){this.id =id;}public String getTitle(){return title;}public void setTitle(ชื่อสตริง){this.title =title;}สตริงสาธารณะ getUrl (){return url;}public void setUrl(String url){this.url =url;}public String getThumbnailUrl(){return thumbnailUrl;}โมฆะสาธารณะ setThumbnailUrl(String thumbnailUrl){this.thumbnailUrl =thumbnailUrl;}} 

นั่นคือทุกสิ่งที่คุณต้องการในตอนนี้ คุณสามารถทดสอบเอาต์พุตของตัวดึงข้อมูล API นี้ได้ในโปรแกรมจำลองแอป เช่น BlueStacks