1

画像をダウンロードしてSDカードに保存しようとしていますが、うまくいくこともあれば、うまくいかないこともあります。理由を理解しようとする助けが必要で、グーグルで検索しようとしましたが、答えが見つかりませんでした。

これは、雑誌の問題を取得し、json 配列の各アイテムをループしてダウンロードし、sd カードに保存するコードです。ただし、一部の画像はダウンロードされず、代わりにスキップされます (logcat を表示)

    /**
     * Background Async Task to Load all product by making HTTP Request
     * */
    class downloadMagazine extends AsyncTask<String, String, String> {

         @Override
            protected void onPreExecute() {
                super.onPreExecute();
                progressDialog = new ProgressDialog(Store.this);
                progressDialog.setMessage("Loading.." + "\n" + "加载中..");
                progressDialog.setIndeterminate(false);
                progressDialog.setCancelable(false);
                progressDialog.show();
            } 
        /**
         * getting preview url and then load them
         * */
        protected String doInBackground(String... args) {
            URL myFileUrl = null;

            // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                // getting JSON string from URL
                JSONObject json = jParser.makeHttpRequest(url_magazine, "GET", params);

                // Check your log cat for JSON reponse
                //Log.d("All Products: ", json.toString());

                try {
                    // Checking for SUCCESS TAG
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // products found
                        // Getting Array of Products
                        mag = json.getJSONArray(TAG_MAGAZINE);

                        for (int i = 0; i < mag.length(); i++) {
                            JSONObject c = mag.getJSONObject(i);

                            // Storing each json item in variable
                            String magazineUrl = c.getString(TAG_MAGAZINE_URL);
                            String issueName = c.getString(TAG_MAGAZINE_NAME);

                            urlList.add(magazineUrl);
                            issueNameList.add(issueName);
                            //System.out.println(urlList);
                        }                   
                    } 
                } catch (JSONException e) {
                    e.printStackTrace();
                }           

                // Building Parameters
                List<NameValuePair> param = new ArrayList<NameValuePair>();
                // getting JSON string from URL
                JSONObject json1 = jParser.makeHttpRequest(urlList.get(pos), "GET", param);

                // CHECKING OF JSON RESPONSE
                Log.d("All guide: ", json.toString());

                try {
                    issues = json1.getJSONArray(TAG_ISSUE);

                    for (int i = 0; i < issues.length(); i++) {
                        JSONObject c = issues.getJSONObject(i);

                        String image = c.getString(TAG_IMAGE);

                        imageList.add(image);
                        //System.out.println(imageList);
                    }   


                    // STOP THE LOOP
                    //break;

                } catch (JSONException e) {
                    e.printStackTrace();
                }

                for (int i = 0; i < imageList.size(); i ++)
                {
                imageUrl = imageList.get(i).toString();
                Log.d("thumbnail", imageUrl);
                number = i;
                try {
                    myFileUrl = new URL(imageUrl);    // RETRIEVE IMAGE URL
                    }
                 catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                try {
                    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
                    conn.setDoInput(true);
                    conn.connect();
                    InputStream in = conn.getInputStream();
                    Log.i("I'm connected", "Download");
                    bmImg = BitmapFactory.decodeStream(in);

                    File filename;
                    // GET EXTERNAL STORAGE, SAVE FILE THERE
                    File storagePath = new File(Environment.getExternalStorageDirectory(),folderName+"issue"+issueNumber+"/");
                    storagePath.mkdirs();

                    filename = new File(storagePath + "/page"+number+".jpg");
                    FileOutputStream out = new FileOutputStream(filename);
                    bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out);

                        out.flush();
                        out.close();

                        MediaStore.Images.Media.insertImage(getContentResolver(),filename.getAbsolutePath(), filename.getName(),
                                filename.getName());          
                        in.close();

                         // displayImage();
                } catch (IOException e) {
                    e.printStackTrace();
                }   
                }

                return null;

}

これは、ページのダウンロードをスキップするときの logcat の出力です (投稿した質問の 1 つに似ていることはわかっていますが、トラブルシューティングの助けが本当に必要です)。何が起こったのかわかりません。グーグルで検索したところ、Android 4.0以降を使用している多くの人がこの問題に直面していることがわかりました

01-23 17:09:29.120: W/System.err(24339): java.io.EOFException
01-23 17:09:29.120: W/System.err(24339):    at libcore.io.Streams.readAsciiLine(Streams.java:203)
01-23 17:09:29.120: W/System.err(24339):    at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:544)
01-23 17:09:29.120: W/System.err(24339):    at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:784)
01-23 17:09:29.120: W/System.err(24339):    at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
01-23 17:09:29.120: W/System.err(24339):    at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
01-23 17:09:29.130: W/System.err(24339):    at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270)
01-23 17:09:29.130: W/System.err(24339):    at com.sfcca.coverflow.Store$downloadMagazine.doInBackground(Store.java:881)
01-23 17:09:29.130: W/System.err(24339):    at com.sfcca.coverflow.Store$downloadMagazine.doInBackground(Store.java:1)
01-23 17:09:29.130: W/System.err(24339):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-23 17:09:29.130: W/System.err(24339):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-23 17:09:29.130: W/System.err(24339):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-23 17:09:29.130: W/System.err(24339):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
01-23 17:09:29.130: W/System.err(24339):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-23 17:09:29.130: W/System.err(24339):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-23 17:09:29.130: W/System.err(24339):    at java.lang.Thread.run(Thread.java:856)
4

2 に答える 2

0

これを見てください:http://code.google.com/p/google-http-java-client/issues/detail?id=116

そこで最後のコメントを試して、問題が解決するかどうかを確認します。

System.setProperty("http.keepAlive", "false");

さて、長期的には必ずしもその設定が必要なわけではありませんが、少なくともそれが関連しているかどうかを確認してください.

この質問はSpringやその他の多くのものに言及していますが、同じ根本的な問題のように見えることに注意してください: Spring Rest Templateの使用によりEOFExceptionが発生します

最後に、あなたがそこで何をしようとしているのか正確にはわかりませんが、1 つの AsyncTask が多くの作業を行っている (そして、ネットワークがなくなるなどの不測の事態に実際に対処していない) が、他のいくつかの方法で問題が発生する可能性があります。そこに(あなたの質問とは関係ありません)。https://github.com/koush/UrlImageViewHelperなどの汎用の画像ダウンロード/キャッシュ ライブラリが役立つ場合は、それを検討することもできます。それらのいずれかを使用していない場合でも、ソースを少し掘り下げると、それらがどのように物事をより堅牢にしているのかがわかります。

于 2013-01-25T03:32:28.307 に答える
0

マニフェストに適切な権限を与えているかどうかを確認してください

 <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2013-01-25T03:02:29.950 に答える