Impossible de créer un gestionnaire à l'intérieur d'un thread qui n'a pas appelé Looper.prepare ()
Je reçois ce message d'erreur "ne Peut pas créer de gestionnaire à l'intérieur de thread qui n'a pas appelé Looper.prepare()"
Pouvez-vous me dire comment résoudre ce problème?
public class PaymentActivity extends BaseActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.payment);
final Button buttonBank = (Button) findViewById(R.id.buttonBank);
buttonBank.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
progressDialog = ProgressDialog.show(PaymentActivity.this, "",
"Redirecting to payment gateway...", true, true);
new Thread() {
public void run() {
try {
startPayment("Bank");
} catch (Exception e) {
alertDialog.setMessage(e.getMessage());
handler.sendEmptyMessage(1);
progressDialog.cancel();
}
}
}.start();
}
});
StartPayment Méthode:
private void startPayment(String id) {
Bundle b = getIntent().getExtras();
final Sail sail = b.getParcelable(Constant.SAIL);
final Intent bankIntent = new Intent(this, BankActivity.class);
try {
Reservation reservation = RestService.createReservation(
sail.getId(),
getSharedPreferences(Constant.PREF_NAME_CONTACT, 0));
bankIntent.putExtra(Constant.RESERVATION, reservation);
//<workingWithDB> Storing Reservation info in Database
DBAdapter db = new DBAdapter(this);
db.open();
@SuppressWarnings("unused")
long rowid;
rowid = db.insertRow(sail.getId(), sail.getFrom(),
sail.getTo(), sail.getShip(), sail.getDateFrom().getTime(),
sail.getPrice().toString(), reservation.getId().floatValue());
db.close();
//</workingWithDB>
String html = PaymentService.getRedirectHTML(id, reservation);
bankIntent.putExtra(Constant.BANK, html);
} catch (Exception e) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog alertDialog = builder.create();
alertDialog.setMessage(e.getMessage());
alertDialog.show();
}
startActivity(bankIntent);
}
source d'informationauteur Sergio
Vous devez vous connecter pour publier un commentaire.
Vous devez savoir que lorsque vous essayez de modifier votre INTERFACE utilisateur , le seulement fil qui peut faire c'est le
UiThread
.Donc, si vous souhaitez modifier votre INTERFACE utilisateur dans un autre fil, essayez d'utiliser la méthode:
Activity.runOnUiThread(new Runnable);
Votre code devrait ressembler à ceci :
Je suppose que vous créez un Gestionnaire dans startPayment() la méthode. Vous ne pouvez pas faire cela, car les gestionnaires peuvent être créés sur le thread de l'INTERFACE utilisateur. Il suffit de créer dans votre classe d'activité.
Au lieu de
new Thread()
ligne, essayez de lui donnervous ne pouvez pas changer toute l'INTERFACE utilisateur dans le fil, vous pouvez utiliser
runOnUIThread
ouAsyncTask
pour plus de détails sur cette cliquez iciJ'ai trouvé que la plupart de la manipulation du fil peut être remplacé par AsyncTasks comme ceci:
Je passe dans le Contexte de l'Application de l'Asynchrone afin de pouvoir créer des boîtes de dialogue.
L'avantage de cette façon de faire est de savoir exactement quelles sont les méthodes les exécuter dans votre INTERFACE utilisateur et qui sont dans un autre thread d'arrière-plan. Votre principale thread d'INTERFACE utilisateur n'est pas en retard, et la séparation en petits async tâches est très agréable.
Le code suppose que votre startPayment() la méthode ne fait rien avec l'INTERFACE utilisateur, et si elle le fait, de le déplacer dans la onPostExecute de l'AsyncTask si c'est fait dans le thread de l'INTERFACE utilisateur.
Essayer