حل ارور Can’t create handler inside thread that has not called Looper.prepare()

با سلام، تو این پست میخوام در مورد ارور Can’t create handler inside thread that has not called Looper.prepare()  بنویسم.

اول از همه این ارور چه زمانی رخ میده!؟ زمانی که داریم از داخل worker thread یه تابع مرتبط با ui را صدا می زنیم. 

برای فراخوانی توابعی همچون Toast.makeText() باید آنها را داخل main thread فراخوانی کنیم.

امّا راه حل:

خب چند تا راه مختلف وجود داره که از قرار موارد زیر هستند:

  • استفاده از RxAndroid
  • runOnUiThread
  • LOOPER
  • AsyncTask
  • Handler

 

من خودم از روش AsyncTask استفاده می کنم، و به ما اجازه می ده که کارهای ناهمگام (asynchronous) را روی UI انجام دهیم. روشی ساده که نمونه کدش میشه:

public void onClick(View v) {
    new CustomTask().execute((Void[])null);
}


private class CustomTask extends AsyncTask<Void, Void, Void> {

    protected Void doInBackground(Void... param) {
        //Do some work
        return null;
    }

    protected void onPostExecute(Void param) {
        //Print Toast or open dialog
    }
}