handler در اندروید
سلام دوستان امروز میخواهیم به بررسی handler در اندروید بپردازیم.پیش نیاز این اموزش اشنایی با مباحث پایه و همچنین ترد ها در اندروید است که در پایان اموزش لینکشان قرار داده شده است.
همانطور که قبل تر با ترد اشنا شدیم ترد ها یک پردازش را جدا برای ما انجام می دهند به گونه ای که با ترد اصلی تداخلی ندارد و منابع جدایی برای ان وجود دارد.هنگامی که عملیات خود را در یک ترد انجام میدادیم به کمک runOnUiThread نتایج را در ui نمایش میدادیم و بدون این دستور امکان ارتباط میان ترد و ui وجود نداشت.
حالا تصور کنید ما یک ترد داریم که یک سری عملیات را برای ما پردازش میکند و ما میخواهیم بعد از انجام این محاسبات و پردازش ها برای ارتباط با ui از ترد اصلی استفاده کنیم.یعنی اگر ما یک mainThread و یک TestThread داشته باشیم بعد از انجام کار ها در TestThread ترد اصلی یعنی mainThread نتایج را برای ما ui نمایش میدهد.
اما نقش handler در اینجا چیست؟
handler ارتباط بین ترد ها و ترد ui را برقرار میکند.
پس به طور خلاصه ترد هنگام نیاز برای ارتباط با ui از کلاس هندلر کمک میگیره.حالا به بررسی یک مثال میپردازیم:
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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:gravity=”center” android:orientation=”vertical”> <TextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:layout_gravity=”center” android:text=”@string/click_start_button” /> <ProgressBar android:id=”@+id/progressBar” style=”?android:attr/progressBarStyleHorizontal” android:layout_width=”match_parent” android:layout_height=”wrap_content” android:layout_margin=”10dp” android:indeterminate=”false” android:max=”10" /> <Button android:id=”@+id/buttonStart” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”@string/start” /> </LinearLayout> |
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public class MainActivity extends Activity implements View.OnClickListener { private Handler mHandler; private ProgressBar mProgressBar; private Button mStartButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler = new Handler(); mProgressBar = (ProgressBar) findViewById(R.id.progressBar); mStartButton = (Button) findViewById(R.id.buttonStart); mStartButton.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.buttonStart: startProgress(); break; } } private void startProgress() { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i <= 30; i++) { final int ProgressCount = i; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.post(new Runnable() { @Override public void run() { mProgressBar.setProgress(ProgressCount); } }); } } }).start(); } } |
خب ما یک progressbar در برناممان قرار دادیم تا به وسیله ان با عملکرد هندلر اشنا شویم.ابتدا یک هندلر تعریف کردیم شکل نوشتن ان به این صورت است:
1 | Handler mHandler=new Handler(); |
همانطور که میبینید ابتدا در تردی که نوشتیم عملیات پردازش انجام می شود سپس در اخر که نیاز به ارتباط با ui برای نمایش progress است از دستور post استفاده کردیم که شکل کلی ان به این صورت است:
1 2 3 4 5 6 7 8 9 10 | mHandler.post(new Runnable() { @Override public void run() { //دستورات ارتباط با ui mProgressBar.setProgress(ProgressCount); } }); } } }).start(); |
و در اخر ترد را استارت میکنیم.جا داره به این نکته اشاره شود که asynctask کار ترد و هندلر را انجام می دهد که میتوانید اموزش ان را در سایت پیدا کنید.
امیدوارم توضیحات خوب بوده باشد.لینک های زیر برای اشنایی بهتر با این مباحث میتوانید مفید باشد:
اموزش thread در اندروید
اموزش asynctask در اندروید
موفق باشید…
سلام
سوال:
چرا باز هم از همون runOnUiThread استفاده نکردیم؟
من با دلیلی که آوردید ضرورت استفاده از هندلر رو متوجه نشدم. آیا دلیلش این بود که میخواستید یک سری پردازش ها انجام بشه بعد بریم روی ترد اصلی با ui کار کنیم؟ وقتی میخواهیم بعد از انجام پردازش ها با ui کار کنیم مجبوریم از هندلر استفاده کنیم و نمیشه با runOnUiThread کار رو پیش برد؟
سلام بله میتوانید از runOnUiThread استفاده کنید فرق چندانی باهم ندارند.
کاربرد Handler فقط به این مورد محدود نمیشه و کاربردهای دیگه ای هم داره مثل اجرای دستور در زمانی مشخص، ارسال Message بین Threadها، انجام کاری بصورت دوره ای و …
موفق باشید.
سلام چه طوری میشه از هندلر استفاده کرد تا وقتی که سرعت نت پایینه برنامه force stopنشه و دوباره صفحه رو رفرش کنه ؟
سلام و درود این به handler مرتبط نمی شود باید برای connection یک timeout تعریف کنید.