java - JSON解析性能慢

标签 java android

我的 JSON 解析器非常慢。我想问一下,如果我遗漏了什么,或者做错了什么。我在 AsyncTask 的 doInBackground 中调用一个方法是错误的吗,我应该把所有东西都放在我的 Asynctask 中吗?感谢您的帮助。这是我的相关代码:

private class DownloadFilesTask extends AsyncTask<String, Integer, Long> {
        private ProgressDialog progress = null;

        @Override
        protected void onPreExecute() {
            progress = ProgressDialog.show(ArticleActivity.this, null,
                    "Artikel wird geladen...");

            super.onPreExecute();
        }

        @Override
        protected Long doInBackground(String... params) {
            // TODO Auto-generated method stub
            String link = getIntent().getStringExtra("articleLink");
            getJSONfromURL("my JSON Url");
            return null;
        }

        protected void onPostExecute(Long result) {
            TextView txtArticle = (TextView) findViewById(R.id.txtViewArticle);
            txtArticle.setText(Html.fromHtml(item.getArticle()));
            progress.dismiss();
        }
    }

getJSONfromURL():

    public static void getJSONfromURL(String url) {

        // initialize
        InputStream is = null;
        String result = "";

        // http post
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection " + e.toString());
        }

        // convert response to string
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            JSONObject jObject = new JSONObject(result);
            String myJSON = jObject.getString("content");
            item = new Items();
            item.setArticle(myJSON);
            Log.i("json", myJSON);
        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data " + e.toString());
        }

    }

谢谢-

编辑:

这是 JSON 响应。它没有那么大。我总是看到这些应用程序,比如 google currents,加载一篇文章甚至不需要一秒钟。他们是怎么做到的?

{
    "domain": "www.spiegel.de",
    "next_page_id": null,
    "url": "http://www.spiegel.de/politik/ausland/bloomberg-empfiehlt-obama-als-us-praesident-a-864853.html",
    "short_url": "http://rdd.me/gfvpdlzr",
    "author": null,
    "excerpt": "Washington - Wenige Tage nach dem verheerenden Sturm \"Sandy\" hat der New Yorker Bürgermeister Michael Bloomberg die Wiederwahl von Präsident",
    "direction": "ltr",
    "word_count": 772,
    "total_pages": 0,
    "content": "<div id=\"spArticleColumn\" score=\"62.5\">\n\n\t\t\t\t\t\n\n\t\t\t<div id=\"spArticleTopAsset\" score=\"40.0\">\n\t\t\t\t\t\n<div class=\"spArticleImageBox spAssetAligncenter\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<span href=\"http://www.spiegel.de/politik/ausland/bild-864853-420390.html\">\n\t\t\t\t\t\t\t\t\t\t\t<img src=\"http://cdn1.spiegel.de/images/image-420390-panoV9free-jmiw.jpg\" width=\"520\" border=\"0\" class=\"spPanoImageTeaserPic\" title='New Yorks Bürgermeister Bloomberg: \"Unser Klima ändert sich\"' alt='New Yorks Bürgermeister Bloomberg: \"Unser Klima ändert sich\"'></span>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\n</div>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n<div id=\"spFbTwitterBarStd\" score=\"1.25\">\n\n\t\n\t\t\n\t\n\t\n\n\t\t\t\n\t</div>\n<div id=\"spArticleSection\" score=\"37.5\">\n\t\n<p>Washington - Wenige Tage nach dem verheerenden Sturm \"Sandy\" hat der New Yorker Bürgermeister <a href=\"http://www.spiegel.de/thema/michael_bloomberg/\" title=\"Michael Bloomberg\" class=\"spTextlinkInt\">Michael Bloomberg</a> die Wiederwahl von Präsident <a href=\"http://www.spiegel.de/thema/barack_obama/\" title=\"Barack Obama\" class=\"spTextlinkInt\">Barack Obama</a> empfohlen. Obama habe die Führerschaft beim Thema Klimawandel inne, schrieb das Stadtoberhaupt auf Bloomberg.com.</p>\n\n<p>\n\n\t\"Unser Klima ändert sich. Und während die Zunahme extremer Wetterlagen, die wir in New York und in der Welt erlebt haben, eine Folge davon sind oder nicht sein mögen, das Risiko, das es so sein könnte - angesichts der Zerstörung in dieser Woche - sollte alle gewählten Führer dazu zwingen, sofort zu Handeln\", so der frühere Republikaner Bloomberg. </p>\n\n<p>Die Metropole und die einzelnen US-Staaten könnten solche Katastrophen nicht alleine stemmen: \"Wir brauchen Führung vom Weißen Haus\", schrieb der Bürgermeister. Obama habe in den vergangenen Jahren wichtige Schritte für den Umweltschutz eingeleitet. Romney habe dagegen in allen wichtigen Bereichen einschließlich dem Umweltschutz den Kurs gewechselt.</p>\n\n<p>New York und die gesamte US-Ostküste sind von der Sturmkatastrophe schwer getroffen worden. Bis Donnerstag zählten die Behörden 56 Tote. In Medien ist von über 80 Opfern die Rede. Experten befürchten, dass sich der Schaden, den \"Sandy\" an der US-Ostküste angerichtet hat, auf bis zu 50 Milliarden Dollar summieren könnte. Die Empfehlung für Obama und der Verweis auf extreme Wetterlagen kommen unmittelbar vor dem Urnengang. Am kommenden Dienstag entscheiden die US-Wähler, ob erneut Obama oder sein republikanischer Herausforderer Mitt Romney ins Weiße Haus einzieht.</p>\n\n<div class=\"spPhotoGallery\" score=\"18.25\">\n\t\n\t\t<ul><li class=\"spFirst\">\n\t\t\t\t\t\t\t\t\t<a href=\"http://www.spiegel.de/fotostrecke/us-praesident-obama-besucht-sandy-sturm-opfer-in-new-jersey-fotostrecke-89203.html\" title=\"Fotostrecke zeigen...\"><img src=\"http://cdn2.spiegel.de/images/image-419915-thumbbiga-sumg.jpg\" width=\"160\" border=\"0\"></a></li> \n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t<a href=\"http://www.spiegel.de/fotostrecke/us-praesident-obama-besucht-sandy-sturm-opfer-in-new-jersey-fotostrecke-89203.html\" title=\"Fotostrecke zeigen...\"><img src=\"http://cdn2.spiegel.de/images/image-419909-thumbbiga-svrk.jpg\" width=\"160\" border=\"0\"></a></li> \n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t<a href=\"http://www.spiegel.de/fotostrecke/us-praesident-obama-besucht-sandy-sturm-opfer-in-new-jersey-fotostrecke-89203.html\" title=\"Fotostrecke zeigen...\"><img src=\"http://cdn4.spiegel.de/images/image-419877-thumbbiga-dvih.jpg\" width=\"160\" border=\"0\"></a></li> \n\t\t\t\t\t\t\t</ul><br clear=\"all\">\n\t\t\t<a href=\"http://www.spiegel.de/fotostrecke/us-praesident-obama-besucht-sandy-sturm-opfer-in-new-jersey-fotostrecke-89203.html\" title=\"Fotostrecke zeigen...\"><strong>Obama im Katastrophengebiet:</strong>\n\t\t\t<span>Kümmerer-in-Chief</span></a></div>\n\t<br clear=\"all\">\nDas Krisenmanagement im Nachgang von \"Sandy\" könnte Obama nun vielleicht genau jenen Vorsprung im Präsidentschaftsrennen bringen, den er braucht, um am 6. November zu siegen. Die Wahlempfehlung des beliebten Bloomberg folgt just einen Tag, nachdem der seinerseits beliebte Republikaner und Gouverneur Chris Christie den Präsidenten in seinem Staat New Jersey empfangen, ihn wieder und wieder für seinen Umgang mit der Katastrophe <a href=\"http://www.spiegel.de/politik/ausland/us-praesident-obama-besucht-sandy-sturm-opfer-in-new-jersey-a-864602.html\" title=\"gelobt\" class=\"spTextlinkInt\">gelobt</a> hat: Außerordentlich, exzellent, wunderbar - das waren die Worte Christies, der eigentlich als einer der entschiedensten Unterstützer von Mitt Romney galt. \n\n<p>Dass nun ausgerechnet Regierungschef und Bürgermeister der vom Sturm am schwersten getroffenen Gebiete - New Jersey und New York City - so einhellig die Führungsqualitäten Obamas in der Krise loben, wird Eindruck machen auf viele unabhängige, unentschiedene Wähler. Die zeigten sich in ihrer Mehrheit zunehmend genervt von der polarisierten Auseinandersetzung zwischen Demokraten und Republikanern. Bloomberg selbst wurde zwischenzeitlich gehandelt als aussichtsreicher Dritte-Partei-Kandidat, der sowohl Romney als auch Obama Stimmen hätte nehmen können. Doch er verzichtete. Fortan bemühten sich beide Lager um seine Wahlempfehlung. Obama hat gewonnen.</p>\n\n<p>Obama selbst hat die Hilfsbereitschaft für die Opfer des Hurrikans \"Sandy\" gelobt. Die Nachbarschaftshilfe sei ebenso überragend gewesen wie die Hilfe über die Parteigrenzen hinweg, sagte Obama am Donnerstag bei einem Wahlkampfauftritt in Green Bay im Bundesstaat Wisconsin. \"Während eines Sturms gibt es keine Demokraten und keine Republikaner\", erklärte der Präsident. Er appellierte an die US-Bürger, die Sturmopfer weiter zu unterstützen. \"Wir sind sprachlos und demütigt angesichts der zerstörerischen Kraft der Natur\", sagte Obama bei seinem ersten Wahlkampfauftritt nach einer Hurrikan-bedingten Zwangspause. </p>\n\n<p>\n<b>Obama setzt erneut auf \"Change\"-Slogan</b>\n</p>\n\n<p>Unterdessen belebt Obama im Wahlkampf-Endspurt einen seiner erfolgreichen Slogans von 2008 wieder: \"Change\". \"Ich weiß wie Wandel aussieht, denn ich habe dafür gekämpft\", sagte er vor etwa 2600 Zuhörern im Bundesstaat Wisconsin. Sein Herausforderer Mitt Romney wolle die Wirtschaftskrise mit Mitteln lösen, die Ursache der ökonomischen Probleme seien, die er bei seinem Amtsantritt vorgefunden habe, sagte Obama. </p>\n\n<p>\"Romney hat alle seine Talente als Verkäufer genutzt, um genau die Politik aufzuhübschen, die unserem Land so sehr geschadet hat. Es ist dieselbe Politik, hinter der wir in den vergangenen vier Jahren hergeputzt haben - und das bietet er an als Wandel.\" So aber sehe Wandel - \"change\" - nicht aus.</p>\n\n<p>\n\n\t\"Change\" war neben \"Hope\" - Hoffnung - einer der Schlüsselbegriffe, mit denen Obama 2008 das Weiße Haus eroberte. Doch im laufenden Wahlkampf verzichtete er bislang weitgehend darauf, an diese griffigen Slogans anzuknüpfen - wohl auch, weil ihm viele Wähler vorwerfen, zu wenig in Washington bewegt und viele seiner Ankündigungen von vor vier Jahren nicht umgesetzt zu haben. </p>\n\n<p>Statt dessen zog Romney mit dem Versprechen durchs Land, für \"wahren Wandel\" - \"real change\" zu sorgen, sollte er am kommenden Dienstag zum Präsidenten gewählt werden. Fünf Tage vor der Wahl schien Obama nun entschlossen, den Begriff für sich zurückzuerobern. \"Wisconsin, ich sage Euch: Wir wissen, wie Wandel aussieht. Und was Romney anbietet, ist sicher kein Wandel.\" </p>\n\n<p>Wisconsin ist einer jener Handvoll Staaten, die die Wahl mitentscheiden könnten, denn hier ist noch nicht klar, wer von den beiden Bewerbern am Ende die Nase vorn haben wird. Auch Nevada, Colorado und Ohio zählen zu den \"battleground states\", die zum Zünglein an der Waage werden könnten. Auch sie standen auf dem Reiseplan des Präsidenten am Donnerstag. Romney wird am Freitag in Wisconsin und Ohio erwartet.</p>\n\n</div>\n<p><i>lei/dpa</i></p>\n\t\n\t\t\n\n\n<br class=\"spBreakNoHeight\" clear=\"all\"></div>\n\t\t\t\t\n\t\t\t\t",
    "date_published": "2012-11-01 20:02:00",
    "dek": "Barack Obama punktet mit seinem Krisenmanagement nach der \"Sandy\"-Katastrophe. New Yorks Bürgermeister Bloomberg setzt sich für die Wiederwahl des US-Präsidenten ein - und verweist auf dessen Klimapolitik. Zuvor hatte ihn bereits ein Top-Wahlhelfer von Mitt Romney gelobt.",
    "lead_image_url": "http://cdn1.spiegel.de/images/image-420390-thumb-jmiw.jpg",
    "title": "US-Wahlkampf: New Yorks Bürgermeister empfiehlt Obama",
    "rendered_pages": 1
}

最佳答案

如果您确实发现 JSON 解析器占用了大量时间,我建议切换到 Jackson Streaming API .与其他解析器相比,它需要更多的设置工作,但我发现它非常快。

关于java - JSON解析性能慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13185469/

相关文章:

java - 将 akka ByteString 转换为 Java InputStream?

java - 如何使 AspectJ Aspect 在 Gradle 项目中工作?

android - 连接到 connect() 处的 url 时出现 IO 异常

android - ActionBar 显示图标,但它显示菜单命令

java - fragment 未显示在 Android 导航组件中

java - 跨集群共享 Java 同步块(synchronized block),还是使用全局锁?

java - 对于字符类型,方法 isDefined(char) 未定义

java - java.lang.Object 的 protected 方法如何免受子类的影响?

java - AlertDialog 中选项列表的 ListView

android - 与 MediaPlayer 类中的 pause() 函数相比,stop() 函数有什么好处?