0

特定の URL またはページ番号が後置された URL をクロールし、そこからすべての画像ファイルをダウンロードするクローラー プログラムを C# で作成しました。正常に動作しました。今、私はAndroidプログラミングの初心者であり、Androidデバイス用に同じことを書いて、携帯電話でも使用できるように考えました。

私が従ったアルゴリズムは...

1) ベース URL、開始ページ番号 (URL の末尾にクエリ文字列のページ番号が付加されている場合)、終了ページ番号、SD カードに画像を保存する場所を取得します。

2) 終了ページ番号が開始ページ番号より小さい場合 (1 つのページのみをクロールする場合)、それを getHtml メソッドに渡します。または、最初から最後のページまでループを作成し、各 URL を getHtml メソッドに渡します。

3) getHtml メソッドで、Web ページのソースをダウンロードし、分割して画像ファイルへのリンクを見つけました。

4) 見つかった画像の URL ごとに、画像ファイルを指定の保存場所にダウンロードします。

アルゴは簡単に思えますが、プログラム全体を作成したとき、かなり大きなパフォーマンスの問題がいくつかありました。非常に重いので、エミュレーターで実行している間、gc が logcat のオブジェクトをクリアしていることしかわかりませんでした。もう 1 つの非常に一般的な問題は、UI がハングすることです。アンドロイドのマルチスレッド。しかし、少なくともプログラムは高速でなければなりません。オブジェクトの数を減らしたり、自分で破壊したりする方法はありますか?

これを改善するために私にできることはありますか?これらの GB 相当のゲームが問題なく動作し、20KB のアプリが非常に遅いのはなぜだろうか。

コード全体です。

package com.dwnldr;
import java.io.*;
import java.net.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import android.app.Activity;
import android.os.*;
import android.util.Log;
import android.view.View;
import android.widget.*;

public class IMGDwnldrActivity extends Activity {

    EditText res;
    String str;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btn = (Button) findViewById(R.id.button1);
        File SDCardRoot = Environment.getExternalStorageDirectory();
        EditText saveat = (EditText) findViewById(R.id.editText4);
        saveat.setText(SDCardRoot.getAbsolutePath());
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
//Getting URL,Start pageno,End pageno and the save location on sdcard
                    EditText baseurl = (EditText) findViewById(R.id.editText1);
                    String url = baseurl.getText().toString();
                    EditText startpage = (EditText) findViewById(R.id.editText2);
                    int start = Integer.parseInt(startpage.getText().toString());
                    EditText endpage = (EditText) findViewById(R.id.editText3);
                    int end = Integer.parseInt(endpage.getText().toString());
                    EditText saveat = (EditText) findViewById(R.id.editText4);
                    String save = saveat.getText().toString();
                    if (start <= end) {
                        for (int i = start; i <= end; i++) {
                            str = "\n--------------------";
                            str += "\nPage No" + String.valueOf(i);
                            writemsg(str);
                            getHtml(url + String.valueOf(i), save);
                        }
                    } else
                        getHtml(url, save);
                    writemsg("Done");
                } catch (Exception ee) {
                    writemsg("\nException fired::" + ee.getMessage());
                }
            }
        });
    }
//method to get the source of a particular url

    public void getHtml(String url, String save) throws ClientProtocolException, IOException {
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse response = httpClient.execute(httpGet, localContext);
            String result = "";
            str = "\nDownloading Page....";
            writemsg(str);
            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().
                    getContent()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                result += line + "\n";
            }
            str = "\nPage Downloaded...";
            writemsg(str);
            String[] pieces;
            if (result.contains(".jpg") || result.contains(".jpeg")) {
                pieces = result.split("\"");
                Log.d("Events", String.valueOf(pieces.length));
                for (int i = 0; i < pieces.length; i++) {
                    if (pieces[i].contains(".jpg") || pieces[i].contains(".jpeg")) {
                        if (pieces[i].contains("http")) {
                            Log.d("Events", pieces[i]);
                            downloadme(pieces[i], save);
                        } else {
                            URL u = new URL(url);
                            if (pieces[i].startsWith("."));
                            pieces[i] = pieces[i].substring(pieces[i].indexOf("/"), pieces[i].length());
                            writemsg(u.getProtocol() + "://" + u.getHost() + pieces[i]);
                            if (pieces[i].startsWith("/"))
                                downloadme(u.getProtocol() + "://" + u.getHost() + pieces[i], save);
                            else
                                downloadme(u.getProtocol() + "://" + u.getHost() + "/" + pieces[i], save);
                        }
                    }
                }
            }
        } catch (Exception ee) {
            writemsg("\nException fired::" + ee.getMessage());
        }
    }
//download each image url given

    private void downloadme(String url1, String save) {
        try {
            str = "\nDownloading Image " + url1;
            writemsg(str);
            URL url = new URL(url1);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoOutput(true);
            urlConnection.connect();
            File f = new File(save);
            if (f.isDirectory() && !f.exists())
                f.mkdirs();
            String fileName = url1.substring(url1.lastIndexOf('/') + 1, url1.length());
            File file = new File(save, fileName);
            FileOutputStream fileOutput = new FileOutputStream(file);
            InputStream inputStream = urlConnection.getInputStream();
            int totalSize = urlConnection.getContentLength();
            str = "\nImage Size " + String.valueOf(totalSize / 1024);
            writemsg(str);
            byte[] buffer = new byte[1024];
            int bufferLength = 0; //used to store a temporary size of the buffer
            while ((bufferLength = inputStream.read(buffer)) > 0) {
                fileOutput.write(buffer, 0, bufferLength);
            }
            fileOutput.close();
            str = "\nDownloaded Image " + url1;
            writemsg(str);
         catch some possible 
            errors //             ...

        } catch (MalformedURLException e) {
            writemsg("\nException fired::" + e.getMessage());
        } catch (IOException e) {
            writemsg("\nException fired::" + e.getMessage());
        } catch (Exception ee) {
            writemsg("\nException fired::" + ee.getMessage());
        }
    }
//write certain text to the Result textbox

    private void writemsg(String msg) {
        res = (EditText) findViewById(R.id.result);
        String str = res.getText().toString();
        str += msg;
        res.setText(str);
    }
}
4

0 に答える 0