Цикл URlConnection InputStream в Java - PullRequest
0 голосов
/ 05 марта 2012

Фон

Мне нужно получить несколько изображений с сайта. У меня есть ссылки, хранящиеся в массиве String (tds []). В основном я получаю входной поток из URL и преобразовываю его в Drawable (у меня также есть массив для этого).

Проблема

Мое приложение падает, удаление цикла делает все нормально, но почему? Я даже создаю массив для URLConnection и InputStream, чтобы он не мешал друг другу, но все равно не работает.

 for(int i = 0; i < 10; i++){
                    mainurl[i] = new URL(tds[i]); 
                    maincon[i] = mainurl[i].openConnection();
                    maincon[i].setDoInput(true);
                    maincon[i].setDoOutput(true); 
                    maincon[i].setAllowUserInteraction(true);
                    maincon[i].setRequestProperty("Connection", "keep-alive");
                    maincon[i].setRequestProperty("Accept-Encoding", "gzip,deflate");
                    maincon[i].setRequestProperty("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7");
                    maincon[i].setRequestProperty("Referer", "referer here");
                                    maincon[i].setRequestProperty("Cookie", "cookie here");
                    maincon[i].setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
                    maincon[i].setRequestProperty("Accept-Language", "ru,en-us;q=0.7,en;q=0.3");
                    maincon[i].setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.12) Gecko/20080201 Firefox");
                    maincon[i].setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
                    maincon[i].setRequestProperty("Pragma", "no-cache");
                       mainis[i] = (InputStream) maincon[i].getContent();
                        d[i] = Drawable.createFromStream(mainis[i], "src name");
                }

Я уверен, что делаю код Ходжи, но есть ли другой метод? Я использую URlCOnnection, потому что мне нужно перенести некоторое RequestProperty на сервер, чтобы получить мое изображение. Вот что у меня есть в LogCat

03-05 07:07:16.650: E/AndroidRuntime(862): FATAL EXCEPTION: main
03-05 07:07:16.650: E/AndroidRuntime(862): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.package.myactivity}: java.lang.NullPointerException
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.os.Looper.loop(Looper.java:123)
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.app.ActivityThread.main(ActivityThread.java:3683)
03-05 07:07:16.650: E/AndroidRuntime(862):  at java.lang.reflect.Method.invokeNative(Native Method)
03-05 07:07:16.650: E/AndroidRuntime(862):  at java.lang.reflect.Method.invoke(Method.java:507)
03-05 07:07:16.650: E/AndroidRuntime(862):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-05 07:07:16.650: E/AndroidRuntime(862):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-05 07:07:16.650: E/AndroidRuntime(862):  at dalvik.system.NativeStart.main(Native Method)
03-05 07:07:16.650: E/AndroidRuntime(862): Caused by: java.lang.NullPointerException
03-05 07:07:16.650: E/AndroidRuntime(862):  at ru.jiznenno.MyComic.onCreate(MyClass.java:90)
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-05 07:07:16.650: E/AndroidRuntime(862):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-05 07:37:03.139: E/AndroidRuntime(1163):     ... 11 more

Ответы [ 3 ]

0 голосов
/ 05 марта 2012
String imageUrl="";
     if imageUrl != null)
                        try {

                            // where imageUrl is what you pulled out from the rss
                            // feed
                            Bitmap bitmap = BitmapFactory
                                    .decodeStream((InputStream) new URL(imageUrl.getContent());
                            if (bitmap != null) {
                                imageview.setImageBitmap(bitmap);
                            }
                        } catch (MalformedURLException e1) {
                            // log exception here
                        } catch (IOException e1) {
                            Log.e("...............................", "" + e1);
                            // log exception here
                        }
0 голосов
/ 05 марта 2012

Вы делаете этот процесс в методе onCreate () или в основном потоке?Поскольку URL.openConnection () является блочной функцией синхронизации, вам следует избегать ее выполнения в главном потоке.

Кроме того, получение данных изображения является довольно длительным процессом, вы должны делать это в фоновом потоке.

Вы можете проверить этот учебник: http://www.vogella.de/articles/AndroidPerformance/article.html

0 голосов
/ 05 марта 2012

Если я правильно понял, ваша цель - загрузить изображение из Интернета.Если это так, не делайте это так сложно.Вы можете использовать BitmapFactory для декодирования входного потока, что очень просто.

BitmapFactory.decodeStream(new URL(IMAGE_URL).openStream());
...