Loader ها در اندروید 3 معرفی شدند و برای لود کردن داده به صورت آسنکرون یا غیرهمگام در یک اکتیویتی یا fragment استفاده می شوند.
- نفیسه افقی 5 سال قبل سوال کرد
- آخرین ویرایش 5 سال قبل
- شما باید برای ارسال دیدگاه وارد شوید
<< اگر با مفهوم loader آشنا نیستید، قویاً توصیه می کنم که این قسمت از آموزش اندروید را مطالعه کنید. >>
می خواهیم یک برنامه اندرویدی خیلی ساده با استفاده از loader بنویسیم. این برنامه قرار است نتایج یک جستجو (که از iTune’s rest api گرفته می شود) را لود کرده و در یک TextView نمایش دهد.
1- ابتدا مطمئن شوید که اجازه دسترسی به اینترنت را در فایل manifest.xml قرار داده اید. زیرا می خواهیم در کلاس AsyncTaskLoader
، به اینترنت وصل شویم.
<uses-permission android:name="android.permission.INTERNET"/>
2- فایل layout برای اکتیویتی اصلی (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:fitsSystemWindows="true">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_json_result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Loading..."/>
</ScrollView>
</LinearLayout>
3- فایل MainActivity.java را نیز بصورت زیر می نویسیم و تمام!
فراخوانی هایی که در زمان اجرا انجام می شود، بدین گونه خواهند بود:
initLoader -> onCreateLoader -> loadInBackground -> deliverResult -> onLoadFinished
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<String> {
private TextView tvJsonResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvJsonResult = (TextView) findViewById(R.id.tv_json_result);
getSupportLoaderManager().initLoader(0, null, (LoaderManager.LoaderCallbacks<String>)this).forceLoad();
}
@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
return new FetchData(this);
}
@Override
public void onLoadFinished(Loader<String> loader, String data) {
tvJsonResult.setText(data);
}
@Override
public void onLoaderReset(Loader<String> loader) {
}
private static class FetchData extends AsyncTaskLoader<String> {
public FetchData(Context context) {
super(context);
}
@Override
public String loadInBackground() {
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String jsonStr = null;
String line;
try {
URL url = new URL("https://itunes.apple.com/search?term=classic");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
// Read the input stream into a String
InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
if (inputStream == null) return null;
reader = new BufferedReader(new InputStreamReader(inputStream));
while ((line = reader.readLine()) != null) buffer.append(line);
if (buffer.length() == 0) return null;
jsonStr = buffer.toString();
} catch (IOException e) {
Log.e("MainActivity", "Error ", e);
return null;
} finally {
if (urlConnection != null) urlConnection.disconnect();
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e("MainActivity", "Error closing stream", e);
}
}
}
return jsonStr;
}
@Override
public void deliverResult(String data) {
super.deliverResult(data);
}
}
}
پاره ای از توضیحات
- کلاس اصلی،
<LoaderManager.LoaderCallbacks <String
را پیاده سازی می کند. String ، نشان دهنده این است که نوع داده ای که loader بر می گرداند، String است. اگرچه می توانید آن را به هر نوع داده (از جمله کلاس های تعریفی خودتان) تغییر دهید. ولی باید مطمئن باشید که توابع callback شما نیز همین نوع داده را به عنوان پارامتر یا داده برگشتی استفاده کنند. - توابع callback ، توابعی مورد نیازی هستند که باید برای اینترفیس LoaderManager.LoaderCallbacks پیاده سازی شوند. اسامی این توابع، کاملاً نشان دهنده کاری است که انجام می دهند.
- در تابع
onCreateLoader
، یک شی از کلاسFetchData
ساخته می شود تا داده را از سرویس rest آیتون دریافت کند. سپس داده لود شده و به تابعonLoadFinished
تحویل داده می شود.
@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
return new FetchData(this);
}
@Override
public void onLoadFinished(Loader<String> loader, String data) {
tvJsonResult.setText(data);
}
@Override
public void onLoaderReset(Loader<String> loader) {
}
کلاس FetchData
، یک کلاس تعریف شده داخل کلاس MainActivity
است. تابع ()loadInBackground
، کار سنگین دریافت داده از اینترنت را انجام داده و تابع ()deliverResult
نیز (همان طور که از نامش پیداست)، داده تحویل گرفته از تابع ()loadInBackground
را بر می گرداند.
- نفیسه افقی 5 سال قبل پاسخ داد
- آخرین ویرایش 5 سال قبل
- شما باید برای ارسال دیدگاه وارد شوید