3

我想在我的android应用中使用.net web服务。我通过使用asynctask向Web服务发送请求。但是请求没有正确地处理价值。我在很多android应用程序中使用了这种结构,我从来没有像这样的错误。问题是什么?Android AsyncTask SoapObject请求问题

我有权限(INTERNET)。名称空间和方法名称是真实的。

public class MainActivity extends Activity { 

     private static final String NAMESPACE = "http://tempuri.org/"; 
     private static final String URL = "http://service.melihmucuk.com/ShopArWS.asmx"; 
     private String[][] items; 

    private String[][] GetAllItems(){ 

     SoapObject request = new SoapObject(NAMESPACE, "GetAllItem");//faulty line 
      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.dotNet = true;  
      envelope.setOutputSoapObject(request); 
      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
      androidHttpTransport.debug = true; 

      try { 

      androidHttpTransport.call("http://tempuri.org/GetAllItem", envelope); 
      SoapObject response = (SoapObject) envelope.getResponse(); 
      items[0] = new String[response.getPropertyCount()]; //item_id 
      items[1] = new String[response.getPropertyCount()]; //price 
      items[2] = new String[response.getPropertyCount()]; //title 
      items[3] = new String[response.getPropertyCount()]; //desc 

      for(int i=0;i<response.getPropertyCount();i++){  
        Object property = response.getProperty(i); 
        if(property instanceof SoapObject){ 
         SoapObject item = (SoapObject) property; 
         String item_id = item.getProperty("item_id").toString(); 
         String price = item.getProperty("price").toString(); 
         String title = item.getProperty("title").toString(); 
         String desc = item.getProperty("desc").toString(); 

         items[0][i] = item_id; 
         items[1][i] = price; 
         items[2][i] = title; 
         items[3][i] = desc; 
        }  
      } 
     } 
      catch (Exception e) {   
       e.printStackTrace(); 
      } 
      return items; 
     } 

    public class GetAllItemsAS extends AsyncTask<String,String,String[][]>{ 



     @Override 
     protected void onPreExecute() { 

     } 

    @Override 
    protected String[][] doInBackground(String... params) { 
     GetAllItems(); 
     return items; 
    } 

    protected void onPostExecute(String[][] items){ 
     ASFinish(); 

    } 
} 

    public void ASFinish(){ 
     ListView liste = (ListView)findViewById(R.id.listView1); 
     ListArrayAdapter adapter = new ListArrayAdapter(MainActivity.this,items[0],items[1],items[2],items[3]); 
     liste.setAdapter(adapter); 
    } 



     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      items = new String[4][0]; 
        new GetAllItemsAS().execute(); 

     } 
    } 

我logcat的

05-22 01:07:10.201: E/WindowManager(22337): Activity com.zontul.shopar.MainActivity has leaked window [email protected] that was originally added here 
05-22 01:07:10.201: E/WindowManager(22337): android.view.WindowLeaked: Activity com.zontul.shopar.MainActivity has leaked window [email protected] that was originally added here 
05-22 01:07:10.201: E/WindowManager(22337):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:464) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:419) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:351) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:171) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.view.Window$LocalWindowManager.addView(Window.java:558) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.app.Dialog.show(Dialog.java:282) 
05-22 01:07:10.201: E/WindowManager(22337):  at com.zontul.shopar.MainActivity$GetAllItemsAS.onPreExecute(MainActivity.java:78) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.os.AsyncTask.execute(AsyncTask.java:534) 
05-22 01:07:10.201: E/WindowManager(22337):  at com.zontul.shopar.MainActivity.onCreate(MainActivity.java:115) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.app.Activity.performCreate(Activity.java:5066) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.app.ActivityThread.access$600(ActivityThread.java:151) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.os.Looper.loop(Looper.java:155) 
05-22 01:07:10.201: E/WindowManager(22337):  at android.app.ActivityThread.main(ActivityThread.java:5520) 
05-22 01:07:10.201: E/WindowManager(22337):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-22 01:07:10.201: E/WindowManager(22337):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-22 01:07:10.201: E/WindowManager(22337):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029) 
05-22 01:07:10.201: E/WindowManager(22337):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796) 
05-22 01:07:10.201: E/WindowManager(22337):  at dalvik.system.NativeStart.main(Native Method) 

编辑:我编辑我的代码,我不使用对话框。请不要写关于对话的答案。问题不会出现在对话框中。

+0

单线解决方案窗口链接错误生成丢失任何使用布局组件的资源ID。可能是任何组件未使用!只是检查 –

+0

我不明白你的意思,你能解释一下吗? –

回答

1

你需要,而不是在类级别初始化ProgressDialogonPreExecute

private ProgressDialog dialog; //declare here 

    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(MainActivity.this); //<< initialize here 
     dialog.setMessage("Loading..."); 
     dialog.show(); 
    } 
//..... 
protected void onPostExecute(String[][] items){ 
    ASFinish(); 
    if(null !=dialog) 
    if(dialog.isShowing()) 
     dialog.dismiss(); 
} 
+0

嘿,它没有工作。我仍然有同样的错误。我认为,这不是关于对话。 –

1

这个错误是因为有另一个/先前的错误在你AsynTask并绑定到这个活动dialog没有被驳回它会激活您发布的异常。

通过,如果你想停止AsynTask如果活动被破坏的方式,remmember到

  • 取消asyntask在onDestroy
  • 如果AsynTask被取消,请覆盖onCancelled函数,并检查doinBackground上的条件以尽快完成 任务。
  • onCancelled也关闭对话框。

否则您的活动可以在onPostExecute之前销毁,并且该函数将激活一个异常。

任何时候都可以通过调用cancel(boolean)取消任务。调用此方法将导致对isCancelled()的后续调用返回true。调用此方法后,onCancelled(Object)将在doInBackground(Object [])返回后调用,而不是onPostExecute(Object)。为了确保任务是尽可能快地取消,应始终从doInBackground检查isCancelled(返回值)定期(对象[]),如果可能的话(例如在一个循环中。)

Reference: AsynTask API

1

实际问题是在GetAllItems()方法中,它正在生成异常,说明活动将要完成的原因,然后您试图显示进度对话框做一件事情,将try catch放入GetAllItems()并尝试在doInBackground中运行此代码。