Отображение .jpg в ImageView из Интернета - PullRequest
2 голосов
/ 02 января 2012

Я не уверен, что я делаю здесь неправильно - кажется, что что-то не так с fetch (), поскольку приложение не принудительно закрывалось, когда я закомментировал этот раздел (и все, что требовалось, это возвращаемое значение, конечно ).

Могли бы использовать вторую пару глаз, если бы вы все были так полезны :)! Это все в моем классе основной деятельности. image.xml (R.layout.image) имеет только ImageView с именем "imageView1"

public void toastGallery(View v)
{
    setContentView(R.layout.image);
    String uri = "http://www.prelovac.com/vladimir/wp-content/uploads/2008/03/example.jpg";
    try
    {
        Context context = v.getContext();
        InputStream is = (InputStream) fetch(uri);
        Drawable d = Drawable.createFromStream(is, "src");
        ImageView imgView = new ImageView(context);
        imgView = (ImageView)findViewById(R.id.imageView1);
        imgView.setImageDrawable(d);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
public Object fetch(String address) throws MalformedURLException,IOException {
        URL url = new URL(address);
        Object content = url.getContent();
        return content;     
}

Информация о LogCat - я предполагаю, что именно здесь выводит StackTrace - поправьте меня, если нет!

01-02 11:59:09.248: D/gralloc_goldfish(971): Emulator without GPU emulation detected.
01-02 11:59:10.088: D/AndroidRuntime(971): Shutting down VM
01-02 11:59:10.088: W/dalvikvm(971): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
01-02 11:59:10.128: E/AndroidRuntime(971): FATAL EXCEPTION: main
01-02 11:59:10.128: E/AndroidRuntime(971): java.lang.IllegalStateException: Could not execute method of the activity
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.view.View$1.onClick(View.java:3044)
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.view.View.performClick(View.java:3511)
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.view.View$PerformClick.run(View.java:14105)
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.os.Handler.handleCallback(Handler.java:605)
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.os.Looper.loop(Looper.java:137)
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.app.ActivityThread.main(ActivityThread.java:4424)
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.lang.reflect.Method.invokeNative(Native Method)
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.lang.reflect.Method.invoke(Method.java:511)
01-02 11:59:10.128: E/AndroidRuntime(971):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-02 11:59:10.128: E/AndroidRuntime(971):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-02 11:59:10.128: E/AndroidRuntime(971):  at dalvik.system.NativeStart.main(Native Method)
01-02 11:59:10.128: E/AndroidRuntime(971): Caused by: java.lang.reflect.InvocationTargetException
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.lang.reflect.Method.invokeNative(Native Method)
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.lang.reflect.Method.invoke(Method.java:511)
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.view.View$1.onClick(View.java:3039)
01-02 11:59:10.128: E/AndroidRuntime(971):  ... 11 more
01-02 11:59:10.128: E/AndroidRuntime(971): Caused by: android.os.NetworkOnMainThreadException
01-02 11:59:10.128: E/AndroidRuntime(971):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
01-02 11:59:10.128: E/AndroidRuntime(971):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.net.URLConnection.getContent(URLConnection.java:194)
01-02 11:59:10.128: E/AndroidRuntime(971):  at java.net.URL.getContent(URL.java:447)
01-02 11:59:10.128: E/AndroidRuntime(971):  at com.tjbiddle.puppywood.PuppyWood.fetch(PuppyWood.java:58)
01-02 11:59:10.128: E/AndroidRuntime(971):  at com.tjbiddle.puppywood.PuppyWood.toastGallery(PuppyWood.java:44)
01-02 11:59:10.128: E/AndroidRuntime(971):  ... 14 more

1 Ответ

0 голосов
/ 02 января 2012

Сота или более поздняя версия убивает все процессы, связанные с сетевым вводом-выводом в потоке пользовательского интерфейса.Это может объяснить, почему вы не видите проблему, когда вы не fetch().Gingerbread также имеет так называемый строгий режим, который может убить такой сетевой ввод-вывод или, по крайней мере, пометить его в журналах.

Если это не так, пожалуйста, опубликуйте трассировку стека, чтобы мы могли помочь вам в дальнейшем.1004 *

Ваша трассировка стека подтверждает то, что я угадал:

01-02 11:59:10.128: E/AndroidRuntime(971): Caused by: android.os.NetworkOnMainThreadException
01-02 11:59:10.128: E/AndroidRuntime(971):      at java.net.URL.getContent(URL.java:447)
[...]
01-02 11:59:10.128: E/AndroidRuntime(971):      at com.tjbiddle.puppywood.PuppyWood.fetch(PuppyWood.java:58)

В общем, это означает, что вам нужно выполнить сетевой ввод-вывод в фоновом потоке.Одним из способов достижения этого является, например, использование AsyncTask, как, например, в в этом примере кода .onPreExecute и onPostExecute работают в потоке пользовательского интерфейса, а doInBackground работает в своем собственном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...