यदि आप एक ऐप डेवलपर हैं, तो ऐसे समय हो सकते हैं जब आप अपने उपयोगकर्ताओं को प्रदान करने के लिए डेटा लाने के लिए एक वेब API शामिल करना चाहें। यह बहुत मुश्किल नहीं है, और यह XML या JSON दोनों में किया जा सकता है। तो इस ट्यूटोरियल में, हम आपको दिखाएंगे कि अपने एंड्रॉइड ऐप में एक साधारण वेब API डेटा फेचर कैसे बनाएं।
इस ट्यूटोरियल के लिए, हम XML के बजाय JSON का उपयोग करेंगे।
JSON में कोड लिखना
सबसे पहले निम्न कोड के साथ एक नई लिस्ट व्यू XML फ़ाइल बनाएं:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/list_title_list" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout> अगला एक नई XML फ़ाइल बनाएं, और यहां आप उन तत्वों को सूचीबद्ध करेंगे जिन्हें आप दिखाना चाहते हैं (ImageView, TextView, आदि.) <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="80dp" android:orientation="vertical" android:padding="5dp" > <ImageView android:id="@+id/iv_icon_social" android:layout_width="60dp" android:layout_height="60dp" android:layout_centerVertical="true" android:visibility="gone" /> <LinearLayout android:id="@+id/thumbnail" android:layout_width="fill_parent" android:layout_height="85dp" android:layout_marginRight="50dp" android:layout_marginTop="0dp" android:layout_toRightOf="@+id/iv_icon_social" android:gravity="center_vertical" android:orientation="vertical" android:padding="5dip" android:visibility="visible" > <TextView android:id="@+id/txt_ttlsm_row" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:text="Sample text" android:textSize="18dp" android:textStyle="bold" /> <TextView android:id="@+id/txt_ttlcontact_row2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="0dp" android:layout_marginTop="3dp" android:paddingLeft="10dp" android:maxEms="20" android:maxLines="2" android:singleLine="false" android:ellipsize="end" android:text="Sample text2" android:textColor="#808080" android:textSize="15dp" android:textStyle="normal" /> </LinearLayout> </RelativeLayout>
API से डेटा लाने के लिए, हमें मुख्य गतिविधि पर जाने की आवश्यकता होगी, और हमें AsyncTask का उपयोग करना होगा क्योंकि API फ़ेचिंग मुख्य थ्रेड पर संभव नहीं है। AsyncTask केवल एक थ्रेड है जो पृष्ठभूमि प्रक्रियाएं करता है, जबकि UI में परिणाम दिखाता है। नेटवर्क प्रक्रियाओं के लिए मुख्य थ्रेड का उपयोग करने से आमतौर पर आपका ऐप क्रैश हो जाएगा। यदि यह थोड़ा भ्रमित करने वाला लगता है, तो RapidAPI पर कुछ अत्यधिक गहन API ट्यूटोरियल देखें।
class DownloadFilesTask extends AsyncTask < Void, Void, String > { private final ProgressDialog dialog = new ProgressDialog(MainActivity.this); @Override protected void onPreExecute() { super.onPreExecute(); this.dialog.setMessage("Signing in..."); this.dialog.show(); } @Override protected 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; } @Override protected void onPostExecute(String response) { super.onPostExecute(response); Log.d("res2", response); dialog.dismiss(); if (response != null) { try { JSONArray arr = new JSONArray(response); DataModel mDatModel = new DataModel(); for (int i = 0; i < arr.length(); i++) { JSONObject c = arr.getJSONObject(i); String id=c.getString(ID); String title = c.getString(TITLE); String uid = c.getString(USER_ID); id_array.add(id); // Toast.makeText(getApplicationContext(), title, Toast.LENGTH_LONG).show(); } adapter = new AAdapter(MainActivity.this, id_array); l.setAdapter(adapter); } catch (Exception e) {} } } } MainActivity.java public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { AAdapter adapter; ArrayList < String > id_array = new ArrayList < String > (); ArrayList < String > notice_array = new ArrayList < String > (); 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 questions = null; protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); l = (ListView) findViewById(R.id.list); new DownloadFilesTask().execute(); l.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView < ? > parent, View view, int position, long 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); } }); } @Override public void onItemClick(AdapterView < ? > parent, View view, int position, long id) {}आपको अपने मुख्य गतिविधि में प्रतिक्रिया मिलेगी
ServiceHandler sh = new ServiceHandler(); String jsonStr = sh.makeServiceCall("https://jsonplaceholder.typicode.com/albums/", ServiceHandler.GET); यह एक सर्विस हैंडलर क्लास के अलावा कुछ नहीं है जो वेब API से अनुरोध और प्रतिक्रिया प्राप्त करने के लिए है इसलिए हम यह सब वेब API से करेंगे। ServiceHandler.java class 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 अनुरोध पैरामीटर */ public String makeServiceCall(String url, int method, List < NameValuePair > params) { try { // http client DefaultHttpClient httpClient = new DefaultHttpClient(); HttpEntity httpEntity = null; HttpResponse httpResponse = null; // HTTP अनुरोध विधि प्रकार की जांच if (method == POST) { HttpPost httpPost = new HttpPost(url); // पोस्ट पैरामीटर जोड़ना if (params != null) { httpPost.setEntity(new UrlEncodedFormEntity(params)); } httpResponse = httpClient.execute(httpPost); } else if (method == GET) { // URL में पैरामीटर जोड़ना if (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(); } return response; } }अब आपके asyncTask में, आपको एक Adapter क्लास मिलेगा, जो एडाप्टर विधि सेट करेगा, लेकिन इसके लिए हमें एक कस्टम एडाप्टर बनाने की आवश्यकता है।
public class AAdapter extends BaseAdapter { private Activity activity; // private ArrayList<HashMap<String, String>> 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); // title String song = title.get(position).toString(); title2.setText(song); TextView title22 = (TextView) vi.findViewById(R.id.txt_ttlcontact_row2); // notice String song2 = title.get(position).toString(); title22.setText(song2); return vi; } }हमें याद रखना होगा कि एडाप्टर क्लास को एंड्रॉइड में अमूर्त क्लास माना जाता है, इसलिए हमें सभी विधियों को लागू करने की आवश्यकता है। नीचे दिए गए कोड में, getView विधि महत्वपूर्ण है, क्योंकि हम दूसरी XML फ़ाइल प्रदर्शित करने के लिए वहां अधिक कोड जोड़ेंगे।
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
और हमें लोड इमेज के लिए एक एडाप्टर क्लास की भी आवश्यकता होगी, ताकि API फेचर इंटरनेट से इमेज लोड कर सके।
public class MyAdapter extends BaseAdapter { ImageLoader imageLoader; private Context ctx; ArrayList < AlbumData > list; public MyAdapter(Context ctx, ArrayList < AlbumData > 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 parent) { // View vi = convertView; ViewHolder viewHolder; if (convertView == null) { LayoutInflater vi = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.abcde, null); viewHolder = new 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(); } 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);*/ } return convertView; } public class ViewHolder { ImageView imageView; TextView textView; }हमने एक कोड टिप्पणी जोड़ी है जो वास्तव में Picasso इमेज लोडर के लिए सिर्फ एक सुझाव है, जो एंड्रॉइड के लिए एक शक्तिशाली ओपन-सोर्स इमेज डाउनलोडर और कैशिंग लाइब्रेरी है, और आपके ऐप में हल्का पदचिह्न रखता है। हालांकि, आप अधिक अनुकूलन के लिए Glide इमेज लोडर का भी उपयोग कर सकते हैं, क्योंकि यह GIF समर्थन और बेहतर मेमोरी प्रबंधन प्रदान करता है।
public class ViewHolder { ImageView imageView; TextView textView; }ViewHolder क्लास क्या करता है वह ViewHolder का एक स्थिर उदाहरण बनाता है, और इसे पहले लोड पर व्यू आइटम से जोड़ता है। फिर इसे भविष्य के कॉल में व्यू टैग से पुनर्प्राप्त किया जाएगा।
getView() विधि को बहुत बार बुलाया जाता है जैसे कि जब ListView में बहुत सारे तत्व होते हैं। इसलिए हम सेट और गेट विधि के लिए एक डेटा मॉडल क्लास लागू करेंगे, जो आपको सरणी सूची के तत्व को प्राप्त करने में मदद करेगा, और भविष्य में आपका जीवन आसान बना देगा।
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() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getThumbnailUrl() { return thumbnailUrl; } public void setThumbnailUrl(String thumbnailUrl) { this.thumbnailUrl = thumbnailUrl; } }अभी के लिए आपको बस इतना ही चाहिए। आप BlueStacks जैसे ऐप एमुलेटर में इस API फेचर के आउटपुट का परीक्षण कर सकते हैं।