• Uncategorized
  • 0

PAB2018-M7-SI-39-04-M.ZAHID SYAFNEL

7.1: Membuat AsyncTask

Tugas 1: Menyiapkan Proyek SimpleAsyncTask

1.1 Membuat layout

  1. Buat proyek baru bernama SimpleAsyncTaskmenggunakan template Empty Activity (terima default untuk opsi lainnya).
  2. Ubah tampilan root RelativeLayoutke LinearLayout.
  3. Tambahkan elemen UI penting berikut ke layout untuk MainActivity
  4. Atribut onClick untuk tombol akan disorot dengan warna kuning, karena metode startTask()belum diimplementasikan di MainActivity. Letakkan kursor pada teks yang disorot, tekan Alt + Enter (Option + Enter di Mac) dan pilih Create ‘startTask(View) dalam ‘MainActivity’ untuk membuat stub metode dalam MainActivity.

Tugas 2: Membuat subkelas AsyncTask

2.1 Menjadikan AsyncTask Subkelas

Buat kelas Java baru bernama SimpleAsyncTask yang memperluas AsyncTask dan yang memerlukan tiga parameter tipe generik:

  • Kosong untuk parameternya karena AsyncTask ini tidak memerlukan masukan apa pun.
  • Kosong untuk tipe kemajuan, karena kemajuan tidak dipublikasikan.
  • String sebagai tipe hasil karena Anda akan memperbarui TextView dengan string saat AsyncTask telah menyelesaikan eksekusi.

  1. Definisikan variabel anggota mTextView.
  2. Implementasikan konstruktor untuk AsyncTask yang memerlukan TextView dan menyetel mTextView ke yang diteruskan dalam TextView:

2.2 Mengimplementasikan doInBackground()

Tambahkan metode doInBackground() yang diperlukan. Letakkan kursor pada deklarasi kelas yang disorot, tekan Alt + Enter (Option + Enter di Mac) dan pilih metode Implement. Pilih doInBackground() dan klik OK:

Implementasikan doInBackground() ke:

  • Buat integer acak antara 0 dan 10
  • Kalikan jumlahnya dengan 200
  • Buat thread saat ini agar tertidur. (Gunakan sleep()) dalam blok try/catch.
  • Kembalikan String “Awake at last after xx milliseconds” (xx adalah jumlah milidetik saat aplikasi tertidur)

2.3 Mengimplementasikan onPostExecute()

Implementasikan onPostExecute() untuk mengambil argumen String (yang Anda definisikan dalam parameter ketiga AsyncTask dan yang metode doInBackground() kembalikan) dan tampilkan string tersebut dalam TextView:

Tugas 3: Mengimplementasikan Langkah Terakhir

3.1 Implementasikan metode yang mulai dengan AsyncTask

Dalam file MainActivity.java file, tambahkan variabel anggota untuk menyimpan TextView.

Dalam metode onCreate(), inisialisasi mTextView ke TextView dalam UI.

Tambahkan kode ke metode startTask() untuk membuat instance SimpleAsyncTask, meneruskan TextView mTextView ke konstruktor.

Perbarui TextView untuk menampilkan teks “Napping…”

 

3.2 Mengimplementasikan onSaveInstanceState()

Ganti metode onSaveInstanceState() dalam MainActivity untuk mempertahankan teks di dalam TextView saat aktivitas dimusnahkan:

Ambil nilai TextView saat aktivitas dipulihkan dalam metodeonCreate().

Hasil Akhir :

Source Code :

Activity_main.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:paddingLeft=”@dimen/activity_horizontal_margin”
android:paddingRight=”@dimen/activity_horizontal_margin”
android:paddingTop=”@dimen/activity_vertical_margin”
android:paddingBottom=”@dimen/activity_vertical_margin”
android:orientation=”vertical”>

<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”@string/ready_to_start”
android:id = “@+id/textView1″
android:textSize=”24sp”/>

<Button
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”@string/start_task”
android:id=”@+id/button”
android:layout_marginTop=”56dp”
android:onClick=”startTask” />
</LinearLayout>

SimpleAsyncTask.java

package android.example.com.simpleasynctask;

import android.os.AsyncTask;
import android.widget.TextView;

import java.util.Random;

/**
* Performs a very simple background task, in this case, just sleeps!
*/
class SimpleAsyncTask extends AsyncTask<Void, Void, String> {

// The TextView where we will show results
private TextView mTextView;

// Constructor that provides a reference to the TextView from the MainActivity
public SimpleAsyncTask(TextView tv) {
mTextView = tv;
}

/**
* Runs on the background thread.
*
* @param voids No parameters in this use case.
* @return Returns the string including the amount of time that
* the background thread slept.
*/
@Override
protected String doInBackground(Void… voids) {

// Generate a random number between 0 and 10
Random r = new Random();
int n = r.nextInt(11);

// Make the task take long enough that we have
// time to rotate the phone while it is running
int s = n * 200;

// Sleep for the random amount of time
try {
Thread.sleep(s);
} catch (InterruptedException e) {
e.printStackTrace();
}

// Return a String result
return “Awake at last after sleeping for ” + s + ” milliseconds!”;
}

/**
* Does something with the result on the UI thread; in this case
* updates the TextView.
*/
protected void onPostExecute(String result) {
mTextView.setText(result);
}
}

 

MainActivity.java

package android.example.com.simpleasynctask;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

/**
* The SimpleAsyncTask app contains a button that launches an AsyncTask
* which sleeps in the asynchronous thread for a random amount of time.
*/
public class MainActivity extends AppCompatActivity {

//Key for saving the state of the TextView
private static final String TEXT_STATE = “currentText”;

// The TextView where we will show results
private TextView mTextView;

/**
* Initializes the activity.
* @param savedInstanceState The current state data
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//  Initialize mTextView
mTextView = (TextView) findViewById(R.id.textView1);

// Restore TextView if there is a savedInstanceState
if(savedInstanceState!=null){
mTextView.setText(savedInstanceState.getString(TEXT_STATE));
}
}

/**
* Handles the onClick for the “Start Task” button. Launches the AsyncTask
* which performs work off of the UI thread.
* @param view The view (Button) that was clicked.
*/
public void startTask (View view) {
// Put a message in the text view
mTextView.setText(R.string.napping);

// Start the AsyncTask.
// The AsyncTask has a callback that will update the text view.
new SimpleAsyncTask(mTextView).execute();
}

/**
* Saves the contents of the TextView to restore on configuration change.
* @param outState The bundle in which the state of the activity is saved when
* it is spontaneously destroyed.
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save the state of the TextView
outState.putString(TEXT_STATE, mTextView.getText().toString());
}
}

AndroidManifest.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”android.example.com.simpleasynctask”>

<application
android:allowBackup=”true”
android:icon=”@mipmap/ic_launcher”
android:label=”@string/app_name”
android:supportsRtl=”true”
android:theme=”@style/AppTheme”>
<activity android:name=”.MainActivity”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
</application>

</manifest>

7.2: Menghubungkan ke Internet dengan AsyncTask dan AsyncTaskLoader

Tugas 1. Menjelajahi Books API

1.1 Mengirimkan Permintaan API Books

Buka Google APIs Explorer (bisa ditemukan di https://developers.google.com/apis-explorer/).

Klik Books API.

Temukan (Ctrl-F atau Cmd-Fbooks.volumes.list dan klik nama fungsi tersebut. Anda seharusnya bisa melihat laman web yang mencantumkan berbagai parameter fungsi API Books yang melakukan penelusuran buku.

Dalam bidang q masukkan nama buku, atau sebagain nama buku. Parameter q adalah satu-satunya bidang yang diwajibkan.

Gunakan bidang maxResults dan printType untuk membatasi hasil ke 10 buku yang cocok yang dicetak. Bidang maxResults mengambil nilai integer yang membatasi jumlah hasil per kueri. Bidang printType mengambil satu dari tiga argumen string: all, yang tidak membatasi hasil menurut tipe sama sekali; books, yang hanya memberikan hasil buku dalam bentuk cetak; dan magazines yang memberikan hasil majalah saja.

Pastikan switch “Authorize requests using OAuth 2.0” di bagian atas formulir dinonaktifkan. Klik Execute without OAuth di bagian bawah formulir.

Tugas 2: Membuat “Who Wrote it?” Aplikasi

2.1 Membuat proyek dan antarmuka pengguna

Buat proyek aplikasi bernama Who Wrote it? dengan satu aktivitas, menggunakan Template Empty Activity.

Tambahkan elemen UI berikut di dalam file XML, menggunakan LinearLayout vertikal sebagai tampilan root—tampilan yang berisi semua tampilan lain di dalam file XML layout. Pastikan LinearLayout menggunakan android:orientation=”vertical”:

Buat metode bernama searchBooks() dalam MainActivity.java untuk menangani tindakan tombol onClick. Seperti pada semua metode onClick, yang satu ini memerlukan View sebagai parameter.

2.2 Menyiapkan Aktivitas Utama

Dalam MainActivity.java, buat variabel anggota untuk EditText, TextView penulis dan TextView judul.

Inisialisasi variabel ini dalam onCreate().

Dalam metode searchBooks(), dapatkan teks dari widget EditText dan konversikan ke String, menetapkannya ke variabel string.

2.3 Membuat AsyncTask kosong

Buat kelas Java baru bernama FetchBook dalam aplikasi/java yang diperluas AsyncTask. AsyncTask memerlukan tiga argumen:

  • Parameter masukan.
  • Indikator kemajuan.
  • Jenis hasil.

Parameter tipe generik untuk tugas adalah <String, Void, String>since the AsyncTask takes a String as the first parameter (the query), Void since there is no progress update, and Stringkarena parameter ini mengembalikan string sebagai hasilnya (respons JSON).

Implementasikan metode yang diperlukan, doInBackground(), dengan meletakkan kursor pada teks yang digarisbawahi merah, menekan Alt + Enter (Opt + Enter di Mac) dan memiilih Implement methods. Pilih doInBackground() dan klik OK. Pastikan parameternya dan kembalikan tipe yang jenisnya benar (Ini memerlukan larik String dan mengembalikan String).

Klik menu Code dan pilih Override methods (atau tekan Ctrl + O). Pilih metodeonPostExecute(). Metode onPostExecute() mengambil String sebagai parameter dan mengembalikan void.

Untuk menampilkan hasil dalam TextView, Anda harus memiliki akses ke TextView yang ada di dalam AsyncTask. Buat variabel anggota dalam FetchBook AsyncTask untuk dua TextView yang menunjukkan hasilnya, dan inisialisasi keduanya dalam konstruktor. Anda akan menggunakan konstruktor ini dalam MainActivity untuk meneruskan TextView ke AsyncTask.

2.4 Membuat kelas NetworkUtils dan membangun URI

Buat kelas Java baru bernama NetworkUtils dengan mengeklik File > New > Java Class dan hanya mengisi bidang “Name”.

Buat variabel LOG_TAG unik untuk digunakan di semua kelas NetworkUtils untuk membuat catatan log

Buat metode statis baru bernama getBookInfo() yang mengambil String sebagai parameter (yang akan menjadi istilah penelusuran) dan mengembalikan String (respons String JSON dari API yang Anda periksa sebelumnya).

Buat dua variabel lokal berikut dalam getBookInfo() yang akan dibutuhkan nanti untuk membantu menyambungkan dan membaca data yang datang.

Buat variabel lokal lain di akhir getBookInfo() untuk memasukkan respons mentah dari kueri dan mengembalikannya:

Buat konstanta anggota berikut dalam kelas NetworkUtils:

Buat blok try/catch/finally skeleton dalamgetBookInfo(). Di sinilah Anda akan membuat permintaan HTTP. Kode untuk membangun URI dan mengeluarkan kueri akan masuk ke dalam blok try. Blok catch digunakan untuk menangani masalah apa pun dengan membuat permintaan HTTP dan blok finally untuk menutup koneksi jaringan setelah Anda selesai menerima data JSON dan mengembalikan hasilnya.

Bangun URI permintaan dalam blok try:

Konversi URI ke URL:

 

2.5 Membuat Permintaan

Dalam blok try metode getBookInfo(), buka koneksi URL dan buat permintaan.

Baca respons menggunakan InputStream dan StringBuffer, lalu konversikan ke String:

Tutup blok try dan log pengecualiannya dalam blok catch.

Tutup kedua urlConnection dan variabel pembaca dalam blok finally:

 

2.6 Menambahkan izin internet

  1. Buka file xml.
  2. Semua izin aplikasi harus diletakkan dalam file AndroidManifest.xml di luar tag <application>;. Anda harus memastikan untuk mengikuti urutan tempat tag didefinisikan dalam AndroidManifest.xml.
  3. Tambahkan tag xml berikut di luar tag <application>:

2.7 Parse string JSON

  1. Dalam onPostExecute(), tambahkan blok try/catch di bawag panggilan ke super.
  2. Gunakan kelas JSON Java bawaan (JSONObjectdan JSONArray) untuk mendapatkan larik JSON item hasil dalam blok try.
  3. literasi melalui itemsArray, memeriksa judul dan informasi penulis setiap buku. Jika keduanya bukan null, keluar dari loop dan perbarui UI; jika tidak, terus periksa daftarnya. Dengan cara ini, hanya entri dengan judul dan penulis yang akan ditampilkan.

 

Tugas 3. Mengimplementasikan praktik terbaik UI

3.1 Menyembunyikan Keyboard dan Memperbarui TextView

Menambahkan kode berikut ke metode searchBooks() untuk menyembunyikan keyboard saat tombol ditekan:

3.2 Mengelola status jaringan dan kasus bidang penelusuran kosong

  1. Modifikasi metode searchBooks()untuk memeriksa kedua koneksi jaringan dan apakah ada teks dalam bidang penelusuran sebelum mengeksekusi tugas FetchBook.
  2. Perbarui UI dalam kasus tidak ada koneksi internet atau tidak ada teks dalam bidang penelusuran. Tampilkan penyebab kesalahan dalam TextView.

Tugas 4. Migrasi ke AsyncTaskLoader

4.1 Membuat AsyncTaskLoader

  1. Salin proyek WhoWroteIt, untuk mempertahankan hasil dari praktik sebelumnya. Ganti nama proyek yang disalin menjadi WhoWroteItLoader.
  2. Buat kelas baru dalam direktori Java bernama BookLoader.
  3. Buat agar kelas BookLoader memperluas AsyncTaskLoader dengan tipe berparameter. .
  4. Pastikan Anda mengimpor loader dari Pustaka Dukungan v4.
  5. Implementasikan metode yang diperlukan (loadInBackground()). Perhatikan kemiripan antara metode ini dan metode doInBackground()awal dengan AsyncTask.
  6. Buat konstruktor untuk kelas baru Anda. Dalam Android Studio, kemungkinan deklarasi kelas akan tetap digarisbawahi dengan warna merah karena konstruktor tidak cocok dengan implementasi superkelas. Dengan adanya kursor pada baris deklarasi kelas, tekan Alt + Enter(Option + Enter di Mac) dan pilih Create constructor matching super. Ini akan membuat konstruktor dengan konteksnya sebagai parameter

4.2 Memodifikasi MainActivity

Tambahkan implementasi LoaderManager.LoaderCallbacks ke deklarasi kelas Aktivitas Utama, yang berparameter dengan tipe String:

Implementasikan metode yang diperlukan:onCreateLoader(), onLoadFinished(), onLoaderReset(). Letakkan kursor teks pada baris tanda tangan kelas dan masukkan Alt + Enter (Option + Enter di Mac). Pastikan semua metode dipilih.

Hasil Akhir :

Source Code:

AndroidManifest.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.example.android.whowroteit”>
<uses-permission android:name=”android.permission.INTERNET” />
<uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE” />

<application
android:allowBackup=”true”
android:icon=”@mipmap/ic_launcher”
android:label=”@string/app_name”
android:supportsRtl=”true”
android:theme=”@style/AppTheme”>

<activity android:name=”.MainActivity”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
</application>

</manifest>

 

BookLoader.java

/*
* Copyright (C) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the “License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an “AS IS” BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.whowroteit;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

/**
* AsyncTaskLoader implementation that opens a network connection and
* query’s the Book Service API.
*/
public class BookLoader extends AsyncTaskLoader<String> {

// Variable that stores the search string.
private String mQueryString;

// Constructor providing a reference to the search term.
public BookLoader(Context context, String queryString) {
super(context);
mQueryString = queryString;
}

/**
* This method is invoked by the LoaderManager whenever the loader is started
*/
@Override
protected void onStartLoading() {
forceLoad(); // Starts the loadInBackground method
}

/**
* Connects to the network and makes the Books API request on a background thread.
*
* @return Returns the raw JSON response from the API call.
*/
@Override
public String loadInBackground() {
return NetworkUtils.getBookInfo(mQueryString);
}
}

 

MainActivity.java

/*
* Copyright (C) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the “License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an “AS IS” BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.whowroteit;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONObject;

/**
* The WhoWroteItLoader app upgrades the WhoWroteIt app to use an AsyncTaskLoader
* instead of an AsyncTask.
*/
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<String>{

// Variables for the search input field, and results TextViews
private EditText mBookInput;
private TextView mTitleText;
private TextView mAuthorText;

/**
* Initializes the activity.
*
* @param savedInstanceState The current state data
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Initialize all the view variables
mBookInput = (EditText)findViewById(R.id.bookInput);
mTitleText = (TextView)findViewById(R.id.titleText);
mAuthorText = (TextView)findViewById(R.id.authorText);

//Check if a Loader is running, if it is, reconnect to it
if(getSupportLoaderManager().getLoader(0)!=null){
getSupportLoaderManager().initLoader(0,null,this);
}
}

/**
* Gets called when the user pushes the “Search Books” button
*
* @param view The view (Button) that was clicked.
*/
public void searchBooks(View view) {
// Get the search string from the input field.
String queryString = mBookInput.getText().toString();

// Hide the keyboard when the button is pushed.
InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);

// Check the status of the network connection.
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

// If the network is active and the search field is not empty,
// add the search term to the arguments Bundle and start the loader.
if (networkInfo != null && networkInfo.isConnected() && queryString.length()!=0) {
mAuthorText.setText(“”);
mTitleText.setText(R.string.loading);
Bundle queryBundle = new Bundle();
queryBundle.putString(“queryString”, queryString);
getSupportLoaderManager().restartLoader(0, queryBundle, this);
}
// Otherwise update the TextView to tell the user there is no connection or no search term.
else {
if (queryString.length() == 0) {
mAuthorText.setText(“”);
mTitleText.setText(R.string.no_search_term);
} else {
mAuthorText.setText(“”);
mTitleText.setText(R.string.no_network);
}
}
}

/**
* Loader Callbacks
*/

/**
* The LoaderManager calls this method when the loader is created.
*
* @param id ID integer to id   entify the instance of the loader.
* @param args The bundle that contains the search parameter.
* @return Returns a new BookLoader containing the search term.
*/
@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
return new BookLoader(this, args.getString(“queryString”));
}

/**
* Called when the data has been loaded. Gets the desired information from
* the JSON and updates the Views.
*
* @param loader The loader that has finished.
* @param data The JSON response from the Books API.
*/
@Override
public void onLoadFinished(Loader<String> loader, String data) {
try {
// Convert the response into a JSON object.
JSONObject jsonObject = new JSONObject(data);
// Get the JSONArray of book items.
JSONArray itemsArray = jsonObject.getJSONArray(“items”);

// Initialize iterator and results fields.
int i = 0;
String title = null;
String authors = null;

// Look for results in the items array, exiting when both the title and author
// are found or when all items have been checked.
while (i < itemsArray.length() || (authors == null && title == null)) {
// Get the current item information.
JSONObject book = itemsArray.getJSONObject(i);
JSONObject volumeInfo = book.getJSONObject(“volumeInfo”);

// Try to get the author and title from the current item,
// catch if either field is empty and move on.
try {
title = volumeInfo.getString(“title”);
authors = volumeInfo.getString(“authors”);
} catch (Exception e){
e.printStackTrace();
}

// Move to the next item.
i++;
}

// If both are found, display the result.
if (title != null && authors != null){
mTitleText.setText(title);
mAuthorText.setText(authors);
mBookInput.setText(“”);
} else {
// If none are found, update the UI to show failed results.
mTitleText.setText(R.string.no_results);
mAuthorText.setText(“”);
}

} catch (Exception e){
// If onPostExecute does not receive a proper JSON string, update the UI to show failed results.
mTitleText.setText(R.string.no_results);
mAuthorText.setText(“”);
e.printStackTrace();
}

}

/**
* In this case there are no variables to clean up when the loader is reset.
*
* @param loader The loader that was reset.
*/
@Override
public void onLoaderReset(Loader<String> loader) {}
}

 

NetworkUtilities.java

/*
* Copyright (C) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the “License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an “AS IS” BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.whowroteit;

import android.net.Uri;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
* Utility class for using the Google Book Search API to download book information.
*/
class NetworkUtils {

private static final String BOOK_BASE_URL =  “https://www.googleapis.com/books/v1/volumes?”;
private static final String QUERY_PARAM = “q”; // Parameter for the search string.
private static final String MAX_RESULTS = “maxResults”; // Parameter that limits search results.
private static final String PRINT_TYPE = “printType”; // Parameter to filter by print type.

// Class name for Log tag.
private static final String LOG_TAG = NetworkUtils.class.getSimpleName();
/**
* Method for downloading book information from the Books API based on a search term.
* This method makes a network call so it can not be called on the main thread.
* @param queryString The search term for the Books API query
* @return The raw response from the API as a JSON String
*/
static String getBookInfo(String queryString){

// Set up variables for the try block that need to be closed in the finally block.
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String bookJSONString = null;

// Attempt to query the Books API.
try {
// Base URI for the Books API.

// Build up your query URI, limiting results to 10 items and printed books.
Uri builtURI = Uri.parse(BOOK_BASE_URL).buildUpon()
.appendQueryParameter(QUERY_PARAM, queryString)
.appendQueryParameter(MAX_RESULTS, “10”)
.appendQueryParameter(PRINT_TYPE, “books”)
.build();

URL requestURL = new URL(builtURI.toString());

// Open the network connection.
urlConnection = (HttpURLConnection) requestURL.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.connect();

// Get the InputStream.
InputStream inputStream = urlConnection.getInputStream();

// Read the response string into a StringBuilder.
StringBuilder builder = new StringBuilder();

reader = new BufferedReader(new InputStreamReader(inputStream));

String line;
while ((line = reader.readLine()) != null) {
// Since it’s JSON, adding a newline isn’t necessary (it won’t affect parsing)
// but it does make debugging a *lot* easier if you print out the completed buffer for debugging.
builder.append(line + “\n”);
}

if (builder.length() == 0) {
// Stream was empty.  No point in parsing.
// return null;
return null;
}
bookJSONString = builder.toString();

// Catch errors.
} catch (IOException e) {
e.printStackTrace();

// Close the connections.
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}

}
}

// Return the raw response.
return bookJSONString;
}
}

 

Activity_main.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:paddingBottom=”@dimen/activity_vertical_margin”
android:paddingLeft=”@dimen/activity_horizontal_margin”
android:paddingRight=”@dimen/activity_horizontal_margin”
android:paddingTop=”@dimen/activity_vertical_margin”
tools:context=”com.example.android.whowroteit.MainActivity”>

<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/instructions”
android:text=”@string/instructions”
android:textAppearance=”@style/TextAppearance.AppCompat.Title”/>

<EditText
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:id=”@+id/bookInput”
android:layout_below=”@id/instructions”
android:inputType=”text”
android:hint=”@string/input_hint”/>
<Button
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/searchButton”
android:text=”@string/button_text”
android:onClick=”searchBooks”
android:layout_below=”@id/bookInput”/>
<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/titleText”
android:layout_below=”@id/searchButton”
android:textAppearance=”@style/TextAppearance.AppCompat.Headline”/>
<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/authorText”
android:layout_below=”@id/titleText”
android:textAppearance=”@style/TextAppearance.AppCompat.Headline”/>
</RelativeLayout>

 

7.3: Penerima Siaran

Tugas 1. Menyiapkan Proyek PowerReceiver

1.1 Membuat Proyek

Membuat Penerima Siaran baru. Pilih nama paket dalam Tampilan Proyek Android dan buka File > New > Other > Broadcast Receiver.

Beri nama kelasnya CustomReceiver dan pastikan “Exported” dan “Enabled” dicentang.

1.2 Mendaftarkan Penerima untuk siaran sistem

Dalam file AndroidManifest.xml, tambahkan kode berikut di antara tag <receiver> untuk mendaftarkan Penerima Anda untuk Intent sistem:

1,3 Mengimplementasikan onReceive() dalam BroadcastReceiver

  1. Buka file CustomReceiver, dan hapus implementasi default dalam metode onReceive().
  2. Dapatkan tindakan dari intent dan simpan dalam variabel Stringbernama intentAction:

Buat pernyataan switch dengan string intentAction, agar aplikasi dapat menampilkan pesan toast yang berbeda untuk setiap tindakan spesifik yang didaftarkan kepada penerima:

Inisialisasi variabel String bernama toastMessage sebelum pernyataan switch, dan jadikan nilainya null agar bisa disetel tergantung pada tindakan siaran yang Anda terima.

Tetapkan toastMessage ke “Power connected!” jika tindakannya ACTION_POWER_CONNECTED, dan “Power disconnected!” jika ACTION_POWER_DISCONNECTED. Ekstrak sumber daya string.

Tampilkan pesan toast untuk durasi pendek setelah pernyataan switch:

Tugas 2. Mengirimkan dan Menerima Siaran Khusus

2.1 Mendefinisikan string Tindakan Siaran khusus

Buat variabel String konstan dalam MainActivity dan kelas CustomReceiver untuk digunakan sebagai Tindakan Intent Siaran (ini adalah string tindakan khusus):

2.2 Tambahkan Tombol “Send Custom Broadcast”

Dalam file activity_main.xml, tambahkan tampilan Tombol dengan atribut berikut:

Ekstrak sumber daya string.

Buat stub untuk metode sendCustomBroadcast(): Klik pada nama metode onClick. Tekan Alt (Option untuk pengguna Mac) + Enter dan pilih ‘Create ‘sendCustomBroadcast(View)’ dalam ‘MainActivity’.

 

2.3 Mengimplementasikan sendCustomBroadcast()

  1. Dalam metode sendCustomBroadcast()di MainActivity, buat Intent baru, dengan string tindakan khusus sebagai argumen.
  2. Intent customBroadcastIntent = new Intent(ACTION_CUSTOM_BROADCAST);
  3. Kirimkan siaran menggunakan kelas LocalBroadcastManager:getInstance(this).sendBroadcast(customBroadcastIntent)

2.4 Mendaftarkan Siaran Khusus

Buat variabel anggota di MainActivity untuk Penerima dan inisialisasi member tersebut:

Dalam onCreate(), dapatkan instance LocalBroadcastManager dan daftarkan penerima dengan tindakan intent khusus:

Ganti metode onDestroy() dan berhenti mendaftarkan penerima dari LocalBroadcastManager:

2.5 Merespons Siaran Khusus

  1. Dalam onReceive()kelas CustomReceiver, tambahkan pernyataan case untuk Tindakan Intent khusus.
  2. Modifikasi pesan toast ke “Custom Broadcast Received”, ekstrak ke dalam strings.xml dan panggil custom_broadcast_toast(tekan Alt + Enter atau Option + Enter di Mac dan pilih extract string resource):

 

Hasil Akhir :

Source code :

AndroidManifest.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.example.android.powerreceiver”>

<application
android:allowBackup=”true”
android:icon=”@mipmap/ic_launcher”
android:label=”@string/app_name”
android:supportsRtl=”true”
android:theme=”@style/AppTheme”>
<activity android:name=”com.example.android.powerreceiver.MainActivity”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>

<receiver
android:name=”com.example.android.powerreceiver.CustomReceiver”
android:exported=”true”>
<intent-filter>
<action android:name=”android.intent.action.ACTION_POWER_CONNECTED”/>
<action android:name=”android.intent.action.ACTION_POWER_DISCONNECTED”/>
</intent-filter>
</receiver>
</application>

</manifest>

 

CustomReceiver.java

/*
* Copyright (C) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the “License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an “AS IS” BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.example.android.powerreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
* Broadcast Receiver implementation that delivers a custom Toast
* message when it receives any of the registered broadcasts
*/
public class CustomReceiver extends BroadcastReceiver {

//String constant that defines the custom Broadcast Action
static final String ACTION_CUSTOM_BROADCAST =
“com.example.android.powerreceiver.ACTION_CUSTOM_BROADCAST”;

//Empty constructor
public CustomReceiver() {
}

/**
* This method gets called when the Broadcast Receiver receives a broadcast that
* it is registered for.
*
* @param context The context of the application when the broadcast is received.
* @param intent The broadcast is delivered in the form of an intent which contains
*               the broadcast action.
*/
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
String toastMessage = null;
switch (intentAction){
case Intent.ACTION_POWER_CONNECTED:
toastMessage = context.getString(R.string.power_connected);
break;
case Intent.ACTION_POWER_DISCONNECTED:
toastMessage = context.getString(R.string.power_disconnected);
break;
case ACTION_CUSTOM_BROADCAST:
toastMessage = context.getString(R.string.custom_broadcast_toast);
break;
}

Toast.makeText(context, toastMessage, Toast.LENGTH_SHORT).show();
}

}

 

MainActivity.java

/*
* Copyright (C) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the “License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an “AS IS” BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.example.android.powerreceiver;

import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

/**
* The Power Receiver app responds to system broadcasts about the power connected state as well
* as a custom broadcast that is sent when the user pushes the button
*/
public class MainActivity extends AppCompatActivity {

private CustomReceiver mReceiver = new CustomReceiver();

private ComponentName mReceiverComponentName;
private PackageManager mPackageManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button broadcastButton = (Button) findViewById(R.id.broadcastButton);

//Get the PackageManager and ComponentName so you can toggle to broadcast receiver.
mReceiverComponentName = new ComponentName(this, CustomReceiver.class);
mPackageManager = getPackageManager();

//Use LocalBroadcastManager so that the broadcast is not received by other applications.
LocalBroadcastManager.getInstance(this).registerReceiver
(mReceiver, new IntentFilter(CustomReceiver.ACTION_CUSTOM_BROADCAST));

//onClick method for the button
broadcastButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendCustomBroadcast();
}
});

}

@Override
protected void onStart() {
//Enable the broadcast receiver when the app is visible
mPackageManager.setComponentEnabledSetting
(mReceiverComponentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
super.onStart();
}

@Override
protected void onStop() {
//Disable the broadcast receiver when the app is visible
mPackageManager.setComponentEnabledSetting
(mReceiverComponentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
super.onStop();
}

/**
* Unregister the broadcast receiver when the app is destroyed. This only unregisters it from
* the custom broadcast, it is still responds to system events defined in AndroidManifest.xml
*/
@Override
protected void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
super.onDestroy();
}

/**
* OnClick method that sends the custom broadcast using the LocalBroadcastManager
*/
private void sendCustomBroadcast() {
Intent customBroadcastIntent = new Intent(CustomReceiver.ACTION_CUSTOM_BROADCAST);
LocalBroadcastManager.getInstance(this).sendBroadcast(customBroadcastIntent);
}
}

 

Activity_main.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:gravity=”center”
android:orientation=”vertical”
android:paddingBottom=”@dimen/activity_vertical_margin”
android:paddingLeft=”@dimen/activity_horizontal_margin”
android:paddingRight=”@dimen/activity_horizontal_margin”
android:paddingTop=”@dimen/activity_vertical_margin”
tools:context=”com.example.android.powerreceiver.MainActivity”>

<Button
android:id=”@+id/broadcastButton”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_margin=”8dp”
android:text=”@string/send_custom_broadcast”/>

</LinearLayout>

 

 

 

 

 

 

M.Zahid Syafnel

I've a dream to be a busineman and a technopreneur

You may also like...

Leave a Reply

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