2012-10-02 4 views
2

Voici mon code. J'appelle Asynctask à l'intérieur du bouton d'envoi et appelle la méthode sendtoserver qui implémente le code du service Web dans la méthode doInBackground.AsyncTask Force Fermeture lors de l'appel de la méthode Webservice

 package asynctask.com; 

    import org.ksoap2.SoapEnvelope; 
    import org.ksoap2.serialization.SoapObject; 
    import org.ksoap2.serialization.SoapSerializationEnvelope; 
    import org.ksoap2.transport.HttpTransportSE; 



    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.app.Activity; 
    import android.app.ProgressDialog; 
    import android.util.Log; 
    import android.view.Menu; 
    import android.view.MenuItem; 
    import android.view.View; 
    import android.view.Window; 
    import android.view.WindowManager; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.DatePicker; 
    import android.widget.EditText; 
    import android.widget.Spinner; 
    import android.widget.Toast; 
    import android.support.v4.app.NavUtils; 

     public class Asyntask extends Activity { 
     boolean resultofmail; 
    Button send; 
    private static final String SOAP_ACTION = "http://sendmail.com/insertfeedback"; 
     private static final String METHOD_NAME = "insertfeedback"; 
     private static final String NAMESPACE = "http://sendmail.com/"; 
     private static final String URL = "http://180.179.48.27:8080/sendmail  /sendmailService?wsdl"; 


     EditText ename; 
     EditText eid,reason; 
     DatePicker sdate,edate; 
     Spinner rfl; 




     @Override 
     public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.leaverequest); 
     send=(Button)findViewById(R.id.button1); 

     eid=(EditText)findViewById(R.id.editText1); 
     ename=(EditText)findViewById(R.id.editText2); 

     sdate=(DatePicker)findViewById(R.id.datePicker1); 
     edate=(DatePicker)findViewById(R.id.datePicker2); 
     rfl=(Spinner)findViewById(R.id.spinner1); 
     reason=(EditText)findViewById(R.id.editText3); 



     send.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       new MailSendingTask().execute((Void[])null); 


      } 
     }); 



     } 

     public boolean sendtoserver() 
      { 
     int day =sdate.getDayOfMonth(); 
     int month=sdate.getMonth()+1; 
     int year =sdate.getYear(); 
     String stdate=day+"/"+month+"/"+year; 

     int day1 =edate.getDayOfMonth(); 
     int month1=edate.getMonth()+1; 
     int year1 =edate.getYear(); 
     String eddate=day1+"/"+month1+"/"+year1; 

       Toast.makeText(getApplicationContext(),stdate+" "+eddate,Toast.LENGTH_LONG).show(); 



      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
       request.addProperty("name",ename.getText().toString()); 
       request.addProperty("code",eid.getText().toString()); 
       request.addProperty("date1",stdate); 
       request.addProperty("date2",eddate); 
       request.addProperty("leave",rfl.getSelectedItem().toString()); 
       request.addProperty("reason",reason.getText().toString()); 



       SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
       envelope.setOutputSoapObject(request); 
       HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 


       try { 
        androidHttpTransport.call(SOAP_ACTION, envelope); 
        Toast.makeText(getApplicationContext(),"Mail Sent",Toast.LENGTH_LONG).show(); 
        return true; 

       } 
       catch (Exception e) { 
        Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show(); 
        return false; 

        } 
    } 



    public class MailSendingTask extends AsyncTask <Void, Void, Void> { 

     private ProgressDialog progressDialog; 

     @Override 
     protected void onPreExecute() { 
      this.progressDialog = ProgressDialog.show(
        Asyntask.this, 
        "Doing Processing", // title 
        "Sending Data To Server", // message 
        true // indeterminate 
      ); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 

      resultofmail=sendtoserver(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void v) { 
      this.progressDialog.cancel(); 
      if (resultofmail) 
      Toast.makeText(getApplicationContext(), "Mail sent", Toast.LENGTH_LONG).show(); 
      else 
       Toast.makeText(getApplicationContext(), "Retry", Toast.LENGTH_LONG).show(); 

     } 

     } 

     } 

LogCat

10-03 00:23:38.600: E/AndroidRuntime(1770): FATAL EXCEPTION: AsyncTask #1 
10-03 00:23:38.600: E/AndroidRuntime(1770): java.lang.RuntimeException: An error occured while executing doInBackground() 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at java.lang.Thread.run(Thread.java:1019) 
10-03 00:23:38.600: E/AndroidRuntime(1770): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at android.os.Handler.<init>(Handler.java:121) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at android.widget.Toast.<init>(Toast.java:68) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at android.widget.Toast.makeText(Toast.java:231) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at asynctask.com.Asyntask.sendtoserver(Asyntask.java:89) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at asynctask.com.Asyntask$ReverseGeocodeLookupTask.doInBackground(Asyntask.java:140) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at asynctask.com.Asyntask$ReverseGeocodeLookupTask.doInBackground(Asyntask.java:1) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
10-03 00:23:38.600: E/AndroidRuntime(1770):  ... 4 more 
10-03 00:23:38.770: W/IInputConnectionWrapper(1770): showStatusIcon on inactive InputConnection 
10-03 00:23:39.250: E/WindowManager(1770): Activity asynctask.com.Asyntask has leaked window [email protected] that was originally added here 
10-03 00:23:39.250: E/WindowManager(1770): android.view.WindowLeaked: Activity asynctask.com.Asyntask has leaked window [email protected] that was originally added here 
10-03 00:23:39.250: E/WindowManager(1770): at android.view.ViewRoot.<init>(ViewRoot.java:259) 
10-03 00:23:39.250: E/WindowManager(1770): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
10-03 00:23:39.250: E/WindowManager(1770): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
10-03 00:23:39.250: E/WindowManager(1770): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
10-03 00:23:39.250: E/WindowManager(1770): at android.app.Dialog.show(Dialog.java:241) 
10-03 00:23:39.250: E/WindowManager(1770): at android.app.ProgressDialog.show(ProgressDialog.java:107) 
10-03 00:23:39.250: E/WindowManager(1770): at android.app.ProgressDialog.show(ProgressDialog.java:90) 
10-03 00:23:39.250: E/WindowManager(1770): at asynctask.com.Asyntask$ReverseGeocodeLookupTask.onPreExecute(Asyntask.java:129) 
10-03 00:23:39.250: E/WindowManager(1770): at android.os.AsyncTask.execute(AsyncTask.java:391) 
10-03 00:23:39.250: E/WindowManager(1770): at asynctask.com.Asyntask$1.onClick(Asyntask.java:67) 
10-03 00:23:39.250: E/WindowManager(1770): at android.view.View.performClick(View.java:2485) 
10-03 00:23:39.250: E/WindowManager(1770): at android.view.View$PerformClick.run(View.java:9080) 
10-03 00:23:39.250: E/WindowManager(1770): at android.os.Handler.handleCallback(Handler.java:587) 
10-03 00:23:39.250: E/WindowManager(1770): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-03 00:23:39.250: E/WindowManager(1770): at android.os.Looper.loop(Looper.java:123) 
10-03 00:23:39.250: E/WindowManager(1770): at android.app.ActivityThread.main(ActivityThread.java:3683) 
10-03 00:23:39.250: E/WindowManager(1770): at java.lang.reflect.Method.invokeNative(Native Method) 
10-03 00:23:39.250: E/WindowManager(1770): at java.lang.reflect.Method.invoke(Method.java:507) 
10-03 00:23:39.250: E/WindowManager(1770): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 
10-03 00:23:39.250: E/WindowManager(1770): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
10-03 00:23:39.250: E/WindowManager(1770): at dalvik.system.NativeStart.main(Native Method) 

NOTE - code Webservice est workingfFine sans AsyncTask tâche.
NOTE - La tâche asynchrone fonctionne correctement lorsque vous effectuez des calculs qui prennent beaucoup de temps directement dans la méthode doInBackground. Justement essayé cette méthode doInBackground à l'intérieur de son service Web de travail et de mise en œuvre, mais maintenant je me suis coincé dans progressdialog.It va disparaître.

if (Looper.myLooper() == null) { 
Looper.prepare(); 
} 
mLooper = Looper.myLooper(); resultofmail=sendtoserver(); 
Looper.loop(); 
return null; 
+0

Vous ne pouvez pas créer de gestionnaire dans une tâche asynchrone sans appeler Looper.prepare(). – AedonEtLIRA

+0

Je ne comprends pas ce que vous dites. Le code fonctionne très bien lorsque j'utilise AsyncTask pour faire de plus gros calculs. Pourriez-vous s'il vous plaît expliquer et modifier mon code. –

+0

if (Looper.myLooper() == null) { \t \t Looper.prepare(); \t \t} \t \t mLooper = Looper.myLooper(); \t \t \t \t \t resultofmail = sendToServer(); \t \t \t Zone répétée.boucle(); \t \t \t return null; Essayé à l'intérieur de doInBackGround Mais maintenant la méthode onPostExecute ne l'exécute pas dans la boîte de dialogue, mais moins Webservice est en train de l'implémenter. –

Répondre

2

Le problème se produit lorsque vous essayez de montrer Toast lors de l'exécution sendToServer() intérieur doInBackground().

Au lieu de cela, je vous suggère de réorganiser votre code et retourner un code d'erreur de doInBackground() et montrer l'intérieur ToastonPostExecute() - qui fonctionne sur thread d'interface utilisateur .

Ou vous pouvez utiliser méthode runOnUiThread qui exécute votre thread d'interface utilisateur Runnable sur .

+1

Ne fonctionne pas Après avoir supprimé tous les toasts du code. –

+1

désolé je suis un idiot son travail maintenant. –

2

Ne créez pas de pains grillés doInBackground. Ils sont interface utilisateur et doivent être effectuées dans l'une des méthodes AsyncTask qui s'exécutent dans le thread UI, peut-être onProgressUpdate. Votre Toast est à l'origine du problème!

+1

Retrait de tous les toasts qui ne fonctionnent toujours pas –

2

vous pouvez créer une méthode pour faire le toast pour vous sur le thread UI.

par exemple.

public static void toastMSG (final String msg , int length) 
    { 
     activity.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(context, msg, length).show(); 

      } 
     }); 
    } 

utiliser cette méthode au lieu du Toast.makeText (...)

Questions connexes