AsyncTask强制在调用Webservice方法时关闭

问题描述:

这是我的代码。我在调用Asynctask里面的发送按钮,并调用了在doInBackground方法内部实现Webservice代码的sendtoserver方法。AsyncTask强制在调用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) 

注 - Webservice的代码是workingfFine没有的AsyncTask任务。
注 - Asynctask在doInBackground方法内直接进行耗时计算时工作正常。

Just试图在doInBackground方法中它的工作和实现Web服务,但现在我卡在progressdialog.It不会消失。

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

如果不调用Looper.prepare(),则无法在AsyncTask中创建处理程序。 – AedonEtLIRA

+0

我不明白你在说什么。当我使用AsyncTask进行更大计算时,代码工作正常。可以请您解释并修改我的代码。 –

+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 Looper。循环(); \t \t \t return null;尝试这里面doInBackGround但现在onPostExecute方法没有运行它卡在对话框中,但仍然没有实现Webservice。 –

出现问题。它运行在UI线程 -

相反,我会建议你重新安排你的代码,并从doInBackground()返回任何错误代码并显示ToastonPostExecute()

或者,你可以利用它运行在您的RunnableUI线程runOnUiThread方法。

+1

不工作从代码中删除所有吐司后。 –

+1

对不起,我现在是个白痴。 –

不要doInBackground创建祝酒。它们是用户界面,应该在UI线程中运行的AsyncTask方法之一中完成,可能是onProgressUpdate

+1

删除所有吐司仍然不起作用 –

你的吐司是什么原因造成的问题!你可以创建一个方法在UI线程上为你做点敬酒。

例如当您尝试显示Toast运行sendtoserver()里面的时候doInBackground()

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

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

      } 
     }); 
    } 

然后用这个方法,而不是Toast.makeText(...)