Can't create handler inside thread that has not called Looper.prepare()
You're calling it from a worker thread. You need to call Toast.makeText()
(and most other functions dealing with the UI) from within the main thread. You could use a handler, for example.
Look up Communicating with the UI Thread in the documentation. In a nutshell:
// Set this up in the UI thread.
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message message) {
// This is where you do your work in the UI thread.
// Your worker tells you in the message what to do.
}
};
void workerThread() {
// And this is how you call it from the worker thread:
Message message = mHandler.obtainMessage(command, parameter);
message.sendToTarget();
}
Other options:
You could use Activity.runOnUiThread()
. Straightforward if you have an Activity
:
@WorkerThread
void workerThread() {
myActivity.runOnUiThread(() -> {
// This is where your UI code goes.
}
}
You could also post to the main looper. This works great if all you have is a Context
.
@WorkerThread
void workerThread() {
ContextCompat.getMainExecutor(context).execute(() -> {
// This is where your UI code goes.
}
}
Deprecated:
You could use an AsyncTask, that works well for most things running in the background. It has hooks that you can call to indicate the progress, and when it's done.
It's convenient, but can leak contexts if not used correctly. It's been officially deprecated, and you shouldn't use it anymore.
Can't create handler inside thread Thread[Thread-5,5,main] that has not called Looper.prepare()
Inside your onResponse
show your dialog like below inside a UI thread
activity.runOnUiThread(new Runnable() {
public void run() {
new AlertDialog.Builder(mcontext)
.setTitle("title:")
.setMessage(TmpPwd)
.setPositiveButton("close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
});
Can't create handler inside thread that has not called Looper.prepare() - Google Translate
You don't need to create a new Handler. You can use any view as a Handler.
txtSource.post(new Runnable() {
public void run(){
txtSource.setText(...
}
});
If you really want to create a Handler, then as mentioned in the error message, call Looper.prepare();
in the first line of doInBackground
and Looper.loop()
in the last line.
doInBackground(){
Looper.prepare();
//your code
Lopper.loop();
}
If your code is inside an activity or have the reference of activity, you can directly do stuffs in the UI thread using the method runOnUiThread
how to fix Can't create handler inside thread that has not called Looper.prepare()
Call looper.prepare()
in the run()
method of your new thread.
A Handler
can't dispatch Messages
or Runnables
to the Looper
of a thread if it does not exist. Refer to this in the official documentation.
Related Topics
How to Measure Distance to Object With Camera
How to Connect Localhost in the Android Emulator
How to Completely Rename an Android Application
How to Make Push Notification With Specific Sound
Control the Playback Speed of Video in Android
How to Fix Mainactivity Does Not Have a Navcontroller
How to Make a Link Open an Instagram Page in an App Installed on Android
How to Transfer from One Fragment to Another in Android
Refresh/Reload/Re Instantiate a Fragment in an Android Tab System
Android Studio - Failed to Apply Plugin [Id 'Com.Android.Application']
How to Set Transparency of a Background Image Android Xml File
Force Video to Open in Youtube App on Android
Keep Screen Alive and App in Front of Lockscreen
How to Make Image Fill Relativelayout Background Without Stretching
Android Prevent Back Button from Closing the App