EN

Search
Close this search box.

موستانگ، وحشیِ دوست داشتنی

پاسخ داده شد
1
0

Loader ها در اندروید 3 معرفی شدند و برای لود کردن داده به صورت آسنکرون یا غیرهمگام در یک اکتیویتی یا fragment استفاده می شوند.

loader در اندروید - موستانگ

  • شما باید برای ارسال دیدگاه شوید
پاسخ عالی
0
0

<< اگر با مفهوم 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 را بر می گرداند.

  • شما باید برای ارسال دیدگاه شوید
نمایش 1 نتیجه
پاسخ شما
اگر قبلاً حساب کاربری دارید با پر کردن فیلد های زیر یا به عنوان مهمان ارسال کنید.
نام*
ایمیل*
وب سایت