1) the implicit this in your call to runOnUiThread is referring to AsyncTask, not your fragment. 2) Fragment doesn't have runOnUiThread. // A class instance private Handler mHandler = new Handler(Looper. getMainLooper()); // anywhere else in your code mHandler.
This is how you can show an Android Toast message from a Fragment: Toast. makeText(getActivity(), "Click!", Toast.
Basically what runOnUiThread() will do is - Runs the specified action on the UI thread. It will check the current thread and if it finds its the MainThread it will execute that task immediately , otherwise first it will switch you to app MainThread and then it will execute the given task.
Try this: getActivity().runOnUiThread(new Runnable...
It's because:
1) the implicit this in your call to runOnUiThread is referring to AsyncTask, not your fragment.
2) Fragment doesn't have runOnUiThread.
However, Activity does.
Note that Activity just executes the Runnable if you're already on the main thread, otherwise it uses a Handler. You can implement a Handler in your fragment if you don't want to worry about the context of this, it's actually very easy:
// A class instance
private Handler mHandler = new Handler(Looper.getMainLooper());
// anywhere else in your code
mHandler.post(<your runnable>);
// ^ this will always be run on the next run loop on the main thread.
EDIT: @rciovati is right, you are in onPostExecute, that's already on the main thread.
fun Fragment?.runOnUiThread(action: () -> Unit) {
this ?: return
if (!isAdded) return // Fragment not attached to an Activity
activity?.runOnUiThread(action)
}
Then, in any Fragment you can just call runOnUiThread. This keeps calls consistent across activities and fragments.
runOnUiThread {
// Call your code here
}
NOTE: If
Fragmentis no longer attached to anActivity, callback will not be called and no exception will be thrown
If you want to access this style from anywhere, you can add a common object and import the method:
object ThreadUtil {
private val handler = Handler(Looper.getMainLooper())
fun runOnUiThread(action: () -> Unit) {
if (Looper.myLooper() != Looper.getMainLooper()) {
handler.post(action)
} else {
action.invoke()
}
}
}
For Kotlin on fragment just do this
activity?.runOnUiThread(Runnable {
//on main thread
})
In Xamarin.Android
For Fragment:
this.Activity.RunOnUiThread(() => { yourtextbox.Text="Hello"; });
For Activity:
RunOnUiThread(() => { yourtextbox.Text="Hello"; });
Happy coding :-)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With