2013-01-04 42 views
3

我是Asynctask編碼的新手,並且遇到一些問題。如何在asynctask類中等待,直到其任務完成

在我的代碼中,我在onClick偵聽器中定義了一個子類,並且在那個類中我創建了一個使用HTTP連接的Asynctask,並且有一些XML解析代碼。問題是,當我點擊我的按鈕時,它不會等待異步任務完成,而是會出現一個錯誤,提示「在主類中出現偏離」。沒有機會處理我的PostExecute,因爲異步任務中的XML解析引發了一個異常,如:「NetworkOnMainThread」。

我真的可以使用一些幫助揭開我的錯誤,這裏是我的代碼:

public class GetDirectoryInfoXMLParser { 

    public static ArrayList<GetDirectoryInfoTableContent> tableContent; 
    private GetDirectoryInfoTableContent table; 
    private Thread alertThread; 
    private ProgressDialog progressDialog; 
    Context context; 
    InputStream is; 

    public GetDirectoryInfoXMLParser(SettingsPage settings) { 
     this.context = settings; 
    } 

    public void getDataFromUrl(String webSite) throws XmlPullParserException, 
      IOException { 

     if (webSite != null) { 
      alert(context); 
      GetDirectoryInfoAsyncTask gDirectoryInfoAsyncTask = new GetDirectoryInfoAsyncTask(); 
      gDirectoryInfoAsyncTask.execute(webSite); 
     } else { 

     } 
    } 

    private class GetDirectoryInfoAsyncTask extends 
      AsyncTask<String, Void, String> { 

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

      HttpClient client = new DefaultHttpClient(); 
      HttpPost post = new HttpPost(
        "http://mobile.primemrm.com/mobile.asmx/GetDirectoryInfo"); 
      ProtocolVersion protocolVersion = post.getProtocolVersion(); 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
      nameValuePairs.add(new BasicNameValuePair("sUrl", params[0])); 

      try { 
       post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse httpResponse = client.execute(post); 
       HttpEntity entity = httpResponse.getEntity(); 
       is = entity.getContent(); 
      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      XmlPullParserFactory factory; 
      try { 
       factory = XmlPullParserFactory.newInstance(); 

       factory.setNamespaceAware(true); 
       XmlPullParser parser = factory.newPullParser(); 
       // InputStream is = getURlResponse(params[0]); 

       if (is == null) { 
        Log.e("GetDirectoryInfoXMLParser", "InputStream is Null"); 
        return null; 
       } 

       else if (is != null) { 
        Log.e("GetDirectoryInfoXMLParser", 
          "InputStream is Not Null"); 
        parser.setInput(new InputStreamReader(is)); 
       } 

       int eventType = parser.getEventType(); 
       String name; 

       while (eventType != XmlPullParser.END_DOCUMENT) { 

        if (eventType == XmlPullParser.START_DOCUMENT) { 
         tableContent = new ArrayList<GetDirectoryInfoTableContent>(); 
        } else if (eventType == XmlPullParser.START_TAG) { 
         name = parser.getName(); 
         if (name.equalsIgnoreCase("Table")) { 
          table = new GetDirectoryInfoTableContent(); 
          /* 
          * for(int i = 0; i< parser.getAttributeCount(); 
          * i++){ 
          * if(parser.getAttributeName(i).equalsIgnoreCase 
          * ("id")){ 
          * table.setId(parser.getAttributeValue(i)); }else 
          * if(parser.getAttributeName(i).equalsIgnoreCase(
          * "rowOrder")); 
          * table.setRowOrder(parser.getAttributeValue(i)); } 
          */ 
         } else if (name 
           .equalsIgnoreCase("EnablePublicMemberDirectory")) { 
          table.setEnablePublicMemberDirectory(parser 
            .nextText()); 
          Log.e("GetDirectoryInfoXMLParser", 
            "EnablePublicMemberDirectory : " 
              + table.getEnablePublicMemberDirectory()); 
         } else if (name.equalsIgnoreCase("Response")) { 
          table.setEnablePublicMemberDirectory(parser 
            .nextText()); 

         } 
        } else if (eventType == XmlPullParser.END_TAG) { 
         name = parser.getName(); 
         if (name.equalsIgnoreCase("Table")) { 
          tableContent.add(table); 
          table = null; 
         } 
        } 

        eventType = parser.next(); 
       } 

      } catch (XmlPullParserException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return null; 
     } 
    } 

    public void alert(final Context context) { 
     progressDialog = ProgressDialog.show(context, "", "Loading..."); 
     alertThread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        sleep(5000); 
        progressDialog.dismiss(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     alertThread.start(); 
    } 
} 

在此先感謝。

被修改:

verify.setOnClickListener(新OnClickListener(){

 public void onClick(View v) { 

      String logingString = login.getText().toString(); 
      String passwordString = password.getText().toString(); 
      websiteString = websiteUrl.getText().toString(); 
      if (websiteString.equals(pref.getString(WEBSITE, null)) 
        && logingString.equals(pref.getString(PREF_USERNAME, 
          null)) 
        && passwordString.equals(pref.getString(PREF_PASSWORD, 
          null))) { 
       //return; 
      } 
      if (saveCredientials(logingString, passwordString, 
        websiteString)) { 
       /*Toast.makeText(getApplicationContext(), 
         "Saved User Name & Password", Toast.LENGTH_LONG) 
         .show();*/ 

      } else { 
       Toast.makeText(getApplicationContext(), 
         "User Name (or) Password is empty", 
         Toast.LENGTH_LONG).show(); 
      } 

      sVersion = version.getText().toString(); 
      sWesiteUrl = websiteUrl.getText().toString(); 
      sLogin = login.getText().toString(); 
      sPassword = password.getText().toString(); 
      if (sWesiteUrl == null || sWesiteUrl == "" 
        || sWesiteUrl.length() == 0) { 
       Log.e("SettingsPage", "Jhansi check 1 sWebsite is null"); 
       websiteNullAlertDialog(); 
       //return; 
      } else if (sWesiteUrl != null) { 
       try { 
        getDirectoyrInforParser.getDataFromUrl(sWesiteUrl); 
       } catch (XmlPullParserException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       if (GetDirectoryInfoXMLParser.tableContent != null) { 

        if (GetDirectoryInfoXMLParser.tableContent.get(0) 
          .getEnablePublicMemberDirectory() 
          .equals("true")) { 
         Log.e("SettingsPage", 
           "Jhansi check 2 sWebsite is Public"); 
         isLoginSucess = true; 
         Intent intent = new Intent(SettingsPage.this, 
           HomePage.class); 
         intent.putExtra("wesiteLogoUrl", sWesiteUrl); 
         startActivity(intent); 

        } else if (GetDirectoryInfoXMLParser.tableContent 
          .get(0).getEnablePublicMemberDirectory() 
          .equals("false")) { 
         Log.e("SettingsPage", 
           "Jhansi check 3 sWebsite is Private"); 
         // ifMember(); 
         if (sLogin == null || sLogin.equals("") 
           || sLogin.length() == 0 
           || sPassword == null 
           || sPassword.equals("") 
           || sPassword.length() == 0) { 
          Log.e("SettingsPage", 
            "Jhansi check 4 loging is null"); 
          ifMember(); 
          // m.sivajhansi 
          return; 
          // alertDialog(); 

         } 

         try { 
          parser.getDataFromUrl(sWesiteUrl, sLogin, 
            sPassword); 

         } catch (XmlPullParserException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 

         if (LoginXMLParser.tableContent != null 
           && LoginXMLParser.tableContent.size() > 0 && sLogin.equals(LoginXMLParser.tableContent 
             .get(0).getContact_email()) 
             && sPassword 
               .equals(LoginXMLParser.tableContent 
                 .get(0) 
                 .getContact_password())) { 
          Log.e("SettingsPage", "data is : " 
            + LoginXMLParser.tableContent); 
          /*if (isLoginCorrect && sLogin.equals(LoginXMLParser.tableContent 
            .get(0).getContact_email()) 
            && sPassword 
              .equals(LoginXMLParser.tableContent 
                .get(0) 
                .getContact_password())) {*/ 
          isLoginSucess = true; 
           Toast.makeText(SettingsPage.this, 
             "Login Sucess", Toast.LENGTH_SHORT) 
             .show(); 

           // isLoginSucess = true; 

           Intent intent = new Intent(
             SettingsPage.this, HomePage.class); 
           intent.putExtra("wesiteLogoUrl", sWesiteUrl); 
           startActivity(intent); 
         // } 
         /* 
          * else { Log.e("SettingsPage", 
          * "Jhansi check 5 "); alertDialog(); } 
          */ 

         }else { 
          Log.e("SettingsPage", "DATA CHECK"); 
         // m.sivajhansi 
          alertDialog(); 
         } 

        } else { 
         Log.e("SettingsPage", "Jhansi check 7"); 
         websiteNullAlertDialog(); 

        } 
       } else if (GetDirectoryInfoXMLParser.tableContent == null){ 
        Log.e("SettingsPage", "Jhansi check 8"); 
        websiteNullAlertDialog(); 

       } 

      } 
     } 

    }); 

這就是所謂的onclick的類是:

公共類GetDirectoryInfoXMLParser {

public static ArrayList<GetDirectoryInfoTableContent> tableContent; 
private GetDirectoryInfoTableContent table; 

public void getDataFromUrl(String webSite) 
     throws XmlPullParserException, IOException { 

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    XmlPullParser parser = factory.newPullParser(); 
    InputStream is = getURlResponse(webSite); 

    if (is == null) { 
     Log.e("GetDirectoryInfoXMLParser", "InputStream is Null"); 
     return ; 
    } 

    else if (is != null) { 
     Log.e("GetDirectoryInfoXMLParser", "InputStream is Not Null"); 
     parser.setInput(new InputStreamReader(is)); 
    } 

    int eventType = parser.getEventType(); 
    String name; 

    while (eventType != XmlPullParser.END_DOCUMENT) { 

     if (eventType == XmlPullParser.START_DOCUMENT) { 
      tableContent = new ArrayList<GetDirectoryInfoTableContent>(); 
     }else if(eventType == XmlPullParser.START_TAG){ 
      name = parser.getName(); 
      if(name.equalsIgnoreCase("Table")){ 
       table = new GetDirectoryInfoTableContent(); 
       /*for(int i = 0; i< parser.getAttributeCount(); i++){ 
        if(parser.getAttributeName(i).equalsIgnoreCase("id")){ 
         table.setId(parser.getAttributeValue(i)); 
        }else if(parser.getAttributeName(i).equalsIgnoreCase("rowOrder")); 
         table.setRowOrder(parser.getAttributeValue(i)); 
       }*/ 
      }else if(name.equalsIgnoreCase("EnablePublicMemberDirectory")){ 
       table.setEnablePublicMemberDirectory(parser.nextText()); 
       Log.e("GetDirectoryInfoXMLParser", "EnablePublicMemberDirectory : "+table.getEnablePublicMemberDirectory()); 
      } else if(name.equalsIgnoreCase("Response")){ 
       table.setEnablePublicMemberDirectory(parser.nextText()); 

      } 
     }else if(eventType == XmlPullParser.END_TAG){ 
      name = parser.getName(); 
      if(name.equalsIgnoreCase("Table")){ 
       tableContent.add(table); 
       table = null; 
      } 
     } 

     eventType = parser.next(); 
    } 


} 

public InputStream getURlResponse(String webSite) { 
    InputStream is = null; 

    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost(
      "http://mobile.primemrm.com/mobile.asmx/GetDirectoryInfo"); 
    ProtocolVersion protocolVersion = post.getProtocolVersion(); 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
    nameValuePairs 
      .add(new BasicNameValuePair("sUrl", webSite)); 

    try { 
     post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse httpResponse = client.execute(post); 
     HttpEntity entity = httpResponse.getEntity(); 
     is = entity.getContent(); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return is; 

} 

}

現在,這是我的代碼可以正常使用upto2.3.3,strictMode的東陽我得到了「NetworkOnMainThread」 ..所以請從這個地獄通過給我一些大綱處理this..Thanks幫助..

回答

3

您需要延伸的AsyncTask本質上講,當看這個http://developer.android.com/reference/android/os/AsyncTask.html

你需要重寫onPreExecute() - 你可以用它來開始展示我們的對話框。

doInBackground() - 你可以做你的鎖止/網絡運營這裏

onPostExecute - 這將觸發一次doInBackground所有操作完成。因此您可以關閉對話框並使用您從doInBackground獲得的數據。

+0

感謝Hades ..但我的問題仍然存在.. – Prasad

+0

你可以改變你現有的代碼到我描述和發佈你的代碼的方式嗎? – Hades

+0

是的我changed.but它不工作,因爲需要..你可以告訴我有什麼辦法來處理在UI線程上的網絡調用,除了Asynctask方法..我在這裏掙扎從這麼多天... – Prasad