2016-07-07 48 views
0

我寫了兩個類,一個用於從XML提要中檢索字段並將它們作爲字符串存儲在類中,另一個類應該檢索這些字段以在xml佈局文件中設置各種TextView的文本。從類(xml解析類)檢索字符串到當前類

使用日誌,我設法看到xml解析器類確實從xml提要中獲取字段,因爲它們是在android監視器中打印的,但是當我嘗試傳遞它們時,它們不會打印在其他類中。當我初始化這些字符串時,我只會得到我設置的默認值。

我可能在做一些非常錯誤的事情,但我不知道,從昨天開始就一直停留在這個問題上!

這裏是XML解析器類存儲的值檢索:

public class StackAgenceXml { 

/** 
* fields 
*/ 
private String urlAgenceStringXml = null; 
private String nom = "nom"; 
private String adresse = "adresse"; 
private String codepostal = "codepostal"; 
private String ville = "ville"; 
private String pays = "pays"; 
private String lat = "lat"; 
private String lng = "lng"; 
private String tel = "tel"; 
private String fax = "fax"; 
private String email = "email"; 
private String web = "url"; 
private String logo = "logo"; 
private XmlPullParserFactory xmlFactoryObject; 
public volatile boolean parsingComplete = false; 

/** 
* Constructor. 
* 
* @param url 
*/ 
public StackAgenceXml(String url) { 
    this.urlAgenceStringXml = url; 
} 

/** 
* @param agenceParser 
*/ 
public void parseXmlAgenceAndStore(XmlPullParser agenceParser) { 
    int event; 
    String text = null; 

    try { 
     event = agenceParser.getEventType(); 
     while (event != XmlPullParser.END_DOCUMENT) { 
      String name = agenceParser.getName(); 

      switch (event) { 
       case XmlPullParser.START_TAG: 
        break; 

       case XmlPullParser.TEXT: 
        text = agenceParser.getText(); 
        break; 

       case XmlPullParser.END_TAG: 
        if (name.equals("nom")) { 
         nom = text; 
        } else if (name.equals("adresse")) { 
         //adresse = agenceParser.getAttributeValue(null, "value"); 
         adresse = text; 
        } else if (name.equals("codepostal")) { 
         codepostal = text; 
        } else if (name.equals("ville")) { 
         ville = text; 
        } else if (name.equals("pays")) { 
         pays = text; 
        } else if (name.equals("lat")) { 
         lat = text; 
        } else if (name.equals("lng")) { 
         lng = text; 
        } else if (name.equals("tel")) { 
         tel = text; 
        } else if (name.equals("fax")) { 
         fax = text; 
        } else if (name.equals("email")) { 
         email = text; 
        } else if (name.equals("url")) { 
         web = text; 
        } else if (name.equals("logo")) { 
         logo = text; 
        } else { 
        } 
        break; 
      } 
      event = agenceParser.next(); 
     } 
     parsingComplete = false; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Log.i("ex of agency info = ", nom + adresse + codepostal + ville + pays + lat + lng + tel + 
      fax + email + web + logo); 
} 

/** 
* fetch data from xml url 
*/ 
public void fetchTypesXml() { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       URL url = new URL(urlAgenceStringXml); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

       conn.setReadTimeout(10000 /*ms*/); 
       conn.setConnectTimeout(15000 /*ms*/); 
       conn.setRequestMethod("GET"); 
       conn.setDoInput(true); 
       conn.connect(); 

       InputStream stream = conn.getInputStream(); 
       xmlFactoryObject = XmlPullParserFactory.newInstance(); 
       XmlPullParser myparser = xmlFactoryObject.newPullParser(); 

       myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
       myparser.setInput(stream, null); 

       parseXmlAgenceAndStore(myparser); 
       stream.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    thread.start(); 
} 

/** 
* GETTERS* 
*/ 
public String getAdresse() { 
    return adresse; 
} 
public String getNom() { 
    return nom; 
} 

public String getCodepostal() { 
    return codepostal; 
} 

public String getVille() { 
    return ville; 
} 

public String getPays() { 
    return pays; 
} 

public String getLat() { 
    return lat; 
} 

public String getLng() { 
    return lng; 
} 

public String getTel() { 
    return tel; 
} 

public String getFax() { 
    return fax; 
} 

public String getEmail() { 
    return email; 
} 

public String getWeb() { 
    return web; 
} 

public String getLogo() { 
    return logo; 
} 
} 

這裏就是我想從XML解析器獲取字符串值類:

public class Contact extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

/** 
* fields 
*/ 
private StackAgenceXml stackAgence; 
private TextView txtAdresse, txtTel, txtFax, txtWeb; 
private String adresse, telephone, fax, website; 
//to change agency go to string values and change the id at the end of xml feed url 
private String urlAgencesXml = "http://api.immotoolbox.com/xml/2.0/AGENCE/agences/?id=115"; 

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

    /**fetch xml data*/ 
    stackAgence = new StackAgenceXml(urlAgencesXml); 
    stackAgence.fetchTypesXml(); 

    /**get references*/ 
    txtAdresse = (TextView) findViewById(R.id.txt_contact_adresse); 
    txtTel = (TextView) findViewById(R.id.txt_contact_tel); 
    txtFax = (TextView) findViewById(R.id.txt_contact_fax); 
    txtWeb = (TextView) findViewById(R.id.txt_contact_web); 

    /**assign text to textviews*/ 
    adresse = stackAgence.getAdresse() + stackAgence.getCodepostal() + stackAgence.getPays(); 
    telephone = stackAgence.getTel(); 
    fax = stackAgence.getFax(); 
    website = stackAgence.getWeb(); 

    Log.i("contact fields retrieved", adresse + telephone + fax + website); 

    txtAdresse.setText(adresse); 
    txtTel.setText(telephone); 
    txtFax.setText(fax); 
    txtWeb.setText(website); 
} 

最後,這裏是日誌,您可以清楚地看到它們在xml解析器類中檢索到,但由於僅打印了默認值,因此未在其他類中檢索到它們:

07-07 09:00:49.830 21234-21234/com.example.adam_jaamour.cfimmobilier W/System: ClassLoader referenced unknown path: /data/app/com.example.adam_jaamour.cfimmobilier-2/lib/x86 
07-07 09:00:49.941 21234-21234/com.example.adam_jaamour.cfimmobilier W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
07-07 09:00:50.115 21234-21369/com.example.adam_jaamour.cfimmobilier D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 

                        [ 07-07 09:00:50.119 21234:21234 D/   ] 
                        HostConnection::get() New Host Connection established 0xaff50460, tid 21234 


                        [ 07-07 09:00:50.149 21234:21369 D/   ] 
                        HostConnection::get() New Host Connection established 0xae4473f0, tid 21369 
07-07 09:00:50.150 21234-21369/com.example.adam_jaamour.cfimmobilier I/OpenGLRenderer: Initialized EGL, version 1.4 
07-07 09:00:52.271 21234-21234/com.example.adam_jaamour.cfimmobilier I/contact fields retrieved: adressecodepostalpaystelfaxurl 
07-07 09:00:52.518 21234-21369/com.example.adam_jaamour.cfimmobilier E/Surface: getSlotFromBufferLocked: unknown buffer: 0xae479a00 
07-07 09:00:52.600 21234-21405/com.example.adam_jaamour.cfimmobilier I/ex of agency info =: Cristea-Flandrin Immobilier21, boulevard des Moulins98000MonacoMonaco43.742968007.42821350+377 93 30 75 61+377 92 16 71 [email protected]://www.agencecristea.comhttp://api.immotoolbox.com/media/cache/xml2_logo/uploads/agences/115/logo-medium.png 
07-07 09:03:35.351 21234-21238/com.example.adam_jaamour.cfimmobilier W/art: Suspending all threads took: 8.151ms 
07-07 09:05:25.616 21234-21238/com.example.adam_jaamour.cfimmobilier W/art: Suspending all threads took: 8.484ms 
07-07 09:05:47.661 21234-21238/com.example.adam_jaamour.cfimmobilier W/art: Suspending all threads took: 5.969ms 
07-07 09:06:00.189 21234-21238/com.example.adam_jaamour.cfimmobilier W/art: Suspending all threads took: 5.851ms 
07-07 09:06:43.804 21234-21238/com.example.adam_jaamour.cfimmobilier W/art: Suspending all threads took: 16.978ms 
07-07 09:07:31.407 21234-21238/com.example.adam_jaamour.cfimmobilier W/art: Suspending all threads took: 7.489ms 

我希望這足以讓任何人在這裏幫助我,如果您還需要其他的東西,請回答下,謝謝! :)

+0

查看日誌的條目4和6以查看我正在檢索默認字符串值 –

回答

1

發生什麼事是您正在運行帶有新線程的XML解析器(HttpURLConnection是異步操作)。因此,mian線程正在調用fetchTypesXml()函數並在實際接收數據之前檢索信息。

事實上,在你的logcat中,你比在類的日誌之前得到活動的日誌。

07-07 09:00:52.271 21234-21234/com.example.adam_jaamour.cfimmobilier I/contact fields retrieved: adressecodepostalpaystelfaxurl 
07-07 09:00:52.518 21234-21369/com.example.adam_jaamour.cfimmobilier E/Surface: getSlotFromBufferLocked: unknown buffer: 0xae479a00 
07-07 09:00:52.600 21234-21405/com.example.adam_jaamour.cfimmobilier I/ex of agency info =: Cristea-Flandrin Immobilier21, boulevard des Moulins98000MonacoMonaco43.742968007.42821350+377 93 30 75 61+377 92 16 71 [email protected]://www.agencecristea.comhttp://api.immotoolbox.com/media/cache/xml2_logo/uploads/agences/115/logo-medium.png 

要解決此問題,您可以在信息準備就緒時實現在活動內部調用函數的接口。我會播下你一些僞代碼..

接口(僞):

public interface XMLResponse { 
    public void sendXMLData(String adresse, String telephone ,String fax, String website, ...); 
} 

你的函數需要接收監聽器(pseucode):

public void fetchTypesXml(XMLResponse listener) { 
    ... 

    // when you finished to request and parse all the data, call the function inside the listener 
    listener.sendXMLData(adresse, telephone, fax, website ...); 

    } 

聲明界面在你的活動和呼叫你的方法與活動(僞代碼):

public class Contact extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, XMLResponse { 

    ... 

    stackAgence.fetchTypesXml(this); 

    ... 

最後,在你的活動,實現接口方法(僞代碼):

@Override 
public void sendXMLData(String adrs, String cdpostal, String pays, String tel, String fx, String web) { 

    adresse = adrs + cdpostal + pays; 
    telephone = tel; 
    fax = fx; 
    website = web; 
    txtAdresse.setText(adresse); 
    txtTel.setText(telephone); 
    txtFax.setText(fax); 
    txtWeb.setText(website); 
} 
+0

我明白你的意思了,我基本上試圖檢索字符串,而他們仍然沒有從XML提要正確的?我確實試圖讓主線程休眠5秒,以使新線程有足夠的時間從XML源加載數據,但它不能正常工作。 –

+0

這不是一個好主意,我已經編輯了我的答案,告訴你如何使用接口和偵聽器。 – adalPaRi

+0

哈哈是啊,我看到它沒有工作,再加上它花了我很多的應用程序的性能。我試着給你的方法,我會讓你知道它是否有效 –