0

У меня этот код, я хочу иметь два разных действия, я хочу показать одно классическое уведомление, чтобы открыть MainActivity, и другое уведомление для LogoutTask, но у меня есть этот java.lang .RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare()java.lang.RuntimeException on NotifyBuilder

Я покажу вам, мой NotificationBuilder, AsyncTask и ошибку.

УВЕДОМЛЕНИЕ МЕТОД

private void sendNotification(final String message) { 
    if (!message.contains("password")) { 
     Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.ic_stat_kleim_letter) 
       .setContentTitle(TITLE_NAME) 
       .setContentText(message) 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 
     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     Random random = new Random(); 
     int m = random.nextInt(9999 - 1000) + 1000; 
     notificationManager.notify(m, notificationBuilder.build()); 
    } else { 
     DoLogoutTask doLogoutTask = new DoLogoutTask(getBaseContext()); 
     doLogoutTask.execute(); 
     Intent intent = new Intent(MyGcmListenerService.this, Login.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(MyGcmListenerService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(MyGcmListenerService.this) 
       .setSmallIcon(R.drawable.ic_stat_kleim_letter) 
       .setContentTitle(TITLE_NAME) 
       .setContentText(message) 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 
     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(0, notificationBuilder.build()); 
    } 
} 

AsyncTask

public class DoLogoutTask extends AsyncTask<Void, Void, Boolean> { 
SoapPrimitive resultString; 
String response; 
SharedPreferences mSharedPreferences; 
SharedPreferences.Editor editor; 
Context context; 
ProgressDialog progressDialog; 
public DoLogoutTask(Context context) { 
    this.context = context; 
    this.progressDialog = new ProgressDialog(context, R.style.progress_dialog_kleim); 
} 
@Override 
protected void onPreExecute() { 
    this.progressDialog.show(); 
    this.progressDialog.setProgressStyle(android.R.style.Widget_ProgressBar_Small); 
    this.progressDialog.setCancelable(false); 
    this.progressDialog.getWindow().setGravity(Gravity.BOTTOM); 
    this.progressDialog.setIndeterminate(true); 
} 
@Override 
protected Boolean doInBackground(Void... params) { 
    return doLogout(); 
} 
@Override 
protected void onPostExecute(Boolean result) { 
    if (progressDialog != null && progressDialog.isShowing()) 
     progressDialog.dismiss(); 
} 
public Boolean doLogout() { 
    Boolean isLoggedOut = null; 
    mSharedPreferences = context.getSharedPreferences(PreferencesUtility.MYPREFERENCES, Context.MODE_PRIVATE); 
    String URL = URL; 
    String METHOD = METHOD; 
    String NAMESPACE = NAMESPACE; 
    String SOAP_ACTION = ACTION; 
    String idCliente = mSharedPreferences.getString(PreferencesUtility.IDCLIENTE, PreferencesUtility.VALUENOTFOUND); 
    String regid = mSharedPreferences.getString(PreferencesUtility.REGID, PreferencesUtility.VALUENOTFOUND); 
    JSONObject parent = new JSONObject(); 
    JSONObject logout = new JSONObject(); 
    JSONArray jsonArray = new JSONArray(); 
    try { 
     logout.put("idCliente", idCliente); 
     logout.put("regid", regid); 
     parent.put("cliente", jsonArray); 
     jsonArray.put(logout); 
     String parentString = parent.toString(); 
     PropertyInfo paramPI = new PropertyInfo(); 
     paramPI.setName("infoCliente"); 
     paramPI.setValue(parentString); 
     paramPI.setType(String.class); 
     SoapObject request = new SoapObject(NAMESPACE, METHOD); 
     request.addProperty(paramPI); 
     SoapSerializationEnvelope soapSerializationEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     soapSerializationEnvelope.dotNet = true; 
     soapSerializationEnvelope.setOutputSoapObject(request); 
     HttpTransportSE transportSE = new HttpTransportSE(URL); 
     transportSE.call(SOAP_ACTION, soapSerializationEnvelope); 
     resultString = (SoapPrimitive) soapSerializationEnvelope.getResponse(); 
     response = resultString.toString(); 
     isLoggedOut = !response.contains("error"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } catch (HttpResponseException e) { 
     e.printStackTrace(); 
    } catch (SoapFault soapFault) { 
     soapFault.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return isLoggedOut; 
    } 
} 

ОШИБКА

12-10 11: 09: 53.486 19138-19390/it.penta.kleim E/AndroidRuntime: FATAL EXCEPTION: AsyncTask # 3 Процесс: it.penta.kleim, PID: 19138 java.lang.RuntimeException: Невозможно создать обработчик внутри резьбы, который не вызвал Looper.prepare() на android.os.Handler. (Handler.java:200) на android.os.Handler. (Handler.java:114) на android.app.Dialog. (Dialog.java:119) на android.app.AlertDialog. (AlertDialog.java:200) на android.app.AlertDialog. (AlertDialog.java:196) на android.app.ProgressDialog. (ProgressDialog.java: 82) на it.penta.kleim.sixteen.retro_asynctasks.DoLogoutTa ск. (DoLogoutTask.java:44) в it.penta.kleim.sixteen.retro_gcm.MyGcmListenerService.sendNotification (MyGcmListenerService.java:107) в it.penta.kleim.sixteen.retro_gcm.MyGcmListenerService.onMessageReceived (MyGcmListenerService.java : 75) на com.google.android.gms.gcm.GcmListenerService.zzq (Неизвестный источник) на com.google.android.gms.gcm.GcmListenerService.zzp (Неизвестный источник) на com.google.android.gms .gcm.GcmListenerService.zzo (Неизвестный источник) на com.google.android.gms.gcm.GcmListenerService.zza (Неизвестный источник) на com.google.android.gms.gcm.GcmListenerService $ 1.run (Неизвестный источник) в java.util.concurrent.T hreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) в java.lang.Thread.run (Thread.java:818)

ответ

0

Ваш метод sendNotification вызывается потоком в пуле потоков, выполняющем onMessageReceived, поэтому оттуда вы не можете касаться представлений. Чтобы прикоснуться к представлениям, вы должны получить обработчик из основного потока (вы можете использовать Looper.getMainLooper()). Пожалуйста, проверьте http://developer.android.com/training/multiple-threads/communicate-ui.html

Вот быстрый образец:

Handler handler = new Handler(Looper.getMainLooper()); 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
     //do stuff on the main thread 
    } 
}); 

Вы должны переместить все связанное с диалога внутри метода Run()

+0

Я знаю, это решение после того, как я прочитал это исключение, но, пожалуйста, Можете ли вы показать мне пример моего кода?Ты такой итальянский, как я, я думаю, пожалуйста, АУТАМИ! :) – kAnGeL

+0

Я обновил ответ с помощью быстрого образца ... вы должны переместить все, касаясь взглядов, в метод запуска обработчика. Тем не менее, я не знаю, будет ли диалог прогресса работать без активности ... попробуйте :) – iLRedEiMAtTi

 Смежные вопросы

  • Нет связанных вопросов^_^