Can't Create Handler Inside Thread That Has Not Called Looper.Prepare()

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



Leave a reply



Submit