0

Android で ical4j を使用して Google カレンダーの ical (.ics) ファイルを解析しようとしています。しかし、入力ストリームからカレンダーを作成するには 40 秒以上かかります。

calendar = builder.build(fis);

ical ファイルのサイズはわずか 150KB です。また、同じコードを使用して PC で実行すると、1 秒もかからずにカレンダーが作成されます。また、LogCat に大量のガベージ コレクションがあることにも気付きました。誰でも私を助けることができますか?

@Override
public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView = (TextView)findViewById(R.id.Hello_World);

    new Download().execute();




  }


 final class Download extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute(){

            TextView.setText("Downloading");

        }

        @Override
        protected Void doInBackground(Void... arg0) {


             try {
                    URL url = new URL(URL);
                    HttpURLConnection c = (HttpURLConnection) url.openConnection();
                    c.setRequestMethod("GET");
                    c.connect();






                    FileOutputStream fos = openFileOutput(fileName, MainActivity.MODE_PRIVATE);

                    InputStream is = c.getInputStream();


                    byte[] buffer = new byte[1024];
                    int length = 0;
                    while ((length = is.read(buffer)) != -1) {
                        fos.write(buffer, 0, length);
                    }
                    fos.close();
                    is.close();
                } catch (IOException e) {
                    Log.d("log_tag", "Error: " + e);
                }


            return null;
        }


        @Override
        protected void onPostExecute(Void Result) {


            TextView.setText("Saved...Loading Data");
             new Loadicaldata().execute();

        }


    }



final class Loadicaldata extends AsyncTask<Void, Void, Void> {

    String Summary = null;

    @Override
    protected Void doInBackground(Void... arg0) {


        FileInputStream fis = null;
        try {
            fis =  openFileInput(fileName);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



        CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_RELAXED_UNFOLDING, true);
        CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_RELAXED_VALIDATION, true);
        CalendarBuilder builder = new CalendarBuilder();



        Calendar calendar = null;   


        try {
            calendar = builder.build(fis);



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


        b.append(calendar.getProperty("X-WR-CALNAME").getValue());

        ComponentList events = calendar.getComponents(Component.VEVENT);

        VEvent Event = (VEvent) events.get(0);

        Summary = Event.getDescription().getValue();

        /*
        for (Object event : calendar.getComponents(Component.VEVENT)) {
            if (((VEvent) event).getSummary() != null) {
                b.append("\n\n");
                b.append(((VEvent) event).getSummary().getValue());
                b.append(": ");
                b.append(((VEvent) event).getStartDate().getDate());

            }
        }
       */

        return null;
    }

    @Override
    protected void onPostExecute(Void Result) {


        TextView.setText(Summary);

    }

}

LogCat: http://dl.dropbox.com/u/35866688/LogCat.txt

また、Calendar.load メソッドにも時間がかかるため、IO エラーの可能性を安全に除外できます。

誰かが興味を持っている場合、これは ical ファイルです。 https://www.google.com/calendar/ical/m0es4hhj4g9d69ibak88tvoup0%40group.calendar.google.com/public/basic.ics

4

1 に答える 1

0

1 つの可能性は、メソッドでバッファリングされていない入力ストリームから読み取っていることですdoInBackground。メソッドがCalendarBuilder.build(...)一度に 1 バイトずつ読み取ると、大量のシステム コールが生成され、処理が大幅に遅くなります。

2 番目の可能性は、問題がガベージ コレクションによって引き起こされていることです。それについてできることはあまりありませんが、ヒープサイズを増やすと役立つ場合があります。(過剰な GC オーバーヘッドの原因の 1 つは、ヒープがいっぱいに近い状態で実行されていることです。各 GC サイクルで多くのメモリを再利用できない場合、GC の効率は大幅に低下します ... )

于 2012-07-14T10:27:44.637 に答える