So fügen Sie einen API-Fetcher in Ihre Android-App ein

Wenn Sie ein App-Entwickler sind, kann es vorkommen, dass Sie eine Web-API zum Abrufen von Daten für Ihre Benutzer einbinden möchten. Es ist nicht besonders schwierig und kann entweder in XML oder JSON durchgeführt werden. In diesem Tutorial zeigen wir Ihnen, wie Sie einen einfachen Web-API-Datenabruf in Ihre Android-App integrieren.

In diesem Tutorial verwenden wir JSON anstelle von XML.

Schreiben des Codes in JSON

Erstellen Sie zunächst eine neue XML-Datei mit Listenansicht mit dem folgenden Code:



 

Next create a new XML file, and this is where you will list the elements you want shown (ImageView, TextView, etc.)











Um Daten von der API abzurufen, müssen wir zur Hauptaktivität wechseln und AsyncTask verwenden, da das Abrufen von APIs im Hauptthread nicht möglich ist. AsyncTask ist einfach ein Thread, der Hintergrundprozesse ausführt und gleichzeitig die Ergebnisse in der Benutzeroberfläche anzeigt. Wenn Sie den Hauptthread für Netzwerkprozesse verwenden, stürzt Ihre App normalerweise ab. Wenn das etwas verwirrend klingt, schauen Sie sich einige sehr ausführlich an API-Tutorials drüben auf RapidAPI.

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("http://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 = "http://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)

{}

Sie finden die Antwort in Ihrer Hauptaktivität

ServiceHandler sh = new ServiceHandler();

String jsonStr = sh.makeServiceCall("http://jsonplaceholder.typicode.com/albums/", ServiceHandler.GET);

this nothing but a service handle class to request and get the respose from web api so we will do all this from web api.

ServiceHandler.java

class ServiceHandler

{

static String response = null;

public final static int GET = 1;

public final static int POST = 2;

public ServiceHandler()

{}

/**

* Making service call

*

* @url - url to make request

* @method - http request method

*/

public String makeServiceCall(String url, int method)

{

return this.makeServiceCall(url, method, null);

}

/**

* Making service call

*

* @url - url to make request

* @method - http request method

* @params - http request params

*/

public String makeServiceCall(String url, int method, List < NameValuePair > params)

{

try

{

// http client

DefaultHttpClient httpClient = new DefaultHttpClient();

HttpEntity httpEntity = null;

HttpResponse httpResponse = null;

// Checking http request method type

if (method == POST)

{

HttpPost httpPost = new HttpPost(url);

// adding post params

if (params != null)

{

httpPost.setEntity(new UrlEncodedFormEntity(params));

}

httpResponse = httpClient.execute(httpPost);

}

else if (method == GET)

{

// appending params to 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;

}

}

Als nächstes finden Sie in Ihrer asyncTask eine Adapterklasse, die die Adaptermethode festlegt. Dazu müssen wir jedoch einen benutzerdefinierten Adapter erstellen.

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); // 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;

}

}

Wir müssen uns daran erinnern, dass die Adapterklasse in Android als abstrakte Klasse betrachtet wird, daher müssen wir alle Methoden implementieren. Im folgenden Code ist die Methode getview wichtig, da wir dort mehr Code hinzufügen, um die zweite XML-Datei anzuzeigen.

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

Außerdem benötigen wir eine Adapterklasse zum Laden von Bildern, damit der API-Abruf Bilder aus dem Internet laden kann.

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://keenthemes.com/preview/conquer/assets/plugins/jcrop/demos/demo_files/image2.jpg")

.into(viewHolder.imageView);*/

/* ImageLoader imageLoader = ImageLoader.getInstance();

imageLoader.displayImage("http://www.keenthemes.com/preview/conquer/assets/plugins/jcrop/demos/demo_files/image1.jpg", viewHolder.imageView);*/

}

return convertView;

}

public class ViewHolder

{

ImageView imageView;

TextView textView;

}

Wir haben einen Codekommentar hinzugefügt, der eigentlich nur ein Vorschlag für ist Picasso-BildladerDies ist ein leistungsstarker Open-Source-Bild-Downloader und eine Caching-Bibliothek für Android, die einen geringen Platzbedarf in Ihrer App hat. Sie können den Glide Image Loader jedoch auch für weitere Anpassungen verwenden, da er GIF-Unterstützung und eine bessere Speicherverwaltung bietet.

public class ViewHolder

{

ImageView imageView;

TextView textView;

}

Die View Holder-Klasse erstellt eine statische Instanz von ViewHolder und hängt sie beim ersten Laden an das View-Element an. Es wird dann bei zukünftigen Aufrufen aus dem View-Tag abgerufen.

Die Methode getView () wird häufig aufgerufen, z. B. wenn die ListView viele Elemente enthält. Daher implementieren wir eine Datenmodellklasse für die set and get-Methode, mit deren Hilfe Sie das Element der Array-Liste abrufen und Ihr Leben in Zukunft einfacher gestalten können.

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;

}

}

Das ist alles was du jetzt brauchst. Sie können die Ausgabe dieses API-Abrufs in einem App-Emulator wie BlueStacks testen.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *