2015-02-08 76 views
0

我试图从URL获取一个字符串并通过Gson创建一个对象。我得到从这个URL:http://gotachles.co.il/data.php字符串,然后我必须将其转换为HTML之后,将其发送到Gson。问题是我的字符串可能太长(150万字),并且在从HTML调用时应用会冻结。 (尝试过,并且对较小的字符串工作正常)。巨大的字符串到HTML

TachlesStringGetter:

class TachlesStringGetter extends AsyncTask<String, String, String> { 

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

     String myJSONString = null; 
     try { 

      myJSONString = new Scanner(new URL(
        "http://gotachles.co.il/data.php").openStream(), "UTF-8") 
        .useDelimiter("\\A").next(); 

      Log.i("TACHLESSTRINGGETTER", "got sucessfuly"); 
      Log.i("TACHLESSTRINGGETTER", "" + myJSONString.length()); 

     } catch (MalformedURLException e) { 

      e.printStackTrace(); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } 

     Log.i("TACHLESSTRINGGETTER", "RETURN"); 

     return myJSONString; 

    } 

} 

的HTML的AsyncTask:

public class FromHTML extends AsyncTask<String, String, String> { 

    private Spanned spanned; 
    private String result; 

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

     Log.i("FROMHTML", "STARTING"); 
     spanned = Html.fromHtml(html[0]); 
     result = spanned.toString(); 

     Log.i("FROMHTML", "Returning"); 

     return result; 
    } 

} 

调用它这样:

public void Jsonnn() { 

     // sending to anynctask 
     try { 
      myJSONString2 = new TachlesStringGetter().execute(myJSONString2) 
        .get(); 
     } catch (InterruptedException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (ExecutionException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } finally { 
      // // from html 

      if (myJSONString2 != null) { 

       Log.i("WEBVIEWCLASS", "DOING HTML STUFF"); 

       try { 
        afterHTML = new FromHTML().execute(myJSONString2).get(); 
       } catch (InterruptedException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } catch (ExecutionException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } finally { 

        Log.i("FINALLY", "STARTING SEOND FINALLY"); 

        try { 

         Gson gson = new Gson(); 
         JsonObj obj = gson.fromJson(afterHTML, JsonObj.class); 
         Toast.makeText(getApplicationContext(), obj + "", 2000) 
           .show(); 

        } catch (JsonSyntaxException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
         Toast.makeText(getApplicationContext(), "oops jsno!", 
           1000).show(); 
        } 

       } 

      }// first finnaly 
     }// second finnaly 

    } 

很抱歉的低劣的代码:d

+0

您是否尝试过使用StringBuilder而不是String? – domi 2015-02-09 01:39:23

+0

如何做到这一点的任何例子? – Max 2015-02-12 18:06:31

+0

查看我的回答,最大。 – domi 2015-02-12 19:18:13

回答

0

StringBuilder的消耗更少的内存比使用String加(str = str1 + str2)。一个例子使用StringBuilder的:

StringBuilder builder = new StringBuilder(); 
builder.append("This is my string"); 

要从建设者让你长字符串(当你试图将其转换为GSON对象),你可以简单地调用builder.toString();

所以,你应该编辑您的AsyncTask类“TachlesStringGetter”应该使用StringBuilder,当你使用某些东西来附加到String时,你也应该改变代码的其他方面。 +运算符在内部使用公共字符串concat(String str)。此方法复制两个字符串的字符,因此它具有与两个字符串的长度成比例的内存要求和运行时复杂性。 StringBuilder的工作效率更高。希望这可以帮助!