Android: функция не работает в Thread, но работает иначе (пытается добавить ProgressDialog) - PullRequest
1 голос
/ 09 декабря 2010

Итак, у меня есть небольшое приложение, над которым я работаю, которое собирает комиксы из Интернета и отображает их на моем телефоне.Ничего особенного, просто используя его, чтобы выучить веревки.Функция называется comicReload ();выполняет большую часть работы, и он вызывается много раз в приложении (при первом запуске, и когда пользователь нажимает определенные кнопки. Вот функция:

public void comicReload () throws IOException {
    //clears some Vectors that have things in them from the last run
    imagetitles.clear();
    imagetext.clear();
    imagelinks.clear();

    //forms the link it will connect to, and connects
    connector = siteBase + Integer.toString(comicNumber);
    doc = Jsoup.connect(connector).get();
    media = doc.select("[src]");

    //gets the required media from the site
    for (Element src : media) {
        if (src.tagName().equals("img"));
            imagetitles.add(src.attr("alt"));
            imagetext.add(src.attr("title"));
            imagelinks.add(src.attr("src"));
    }

    //some variables I could probably get rid of, but it's easy to read
    Integer titlesize = imagetitles.size();
    Integer textsize = imagetext.size();
    Integer linkssize = imagelinks.size();

    comicTitle = (imagetitles.get(titlesize-4));
    hoverText = (imagetext.get(textsize-4));
    comicLink = (imagelinks.get(linkssize-4));

    //gets the picture I am looking for along with the associated text
    URL url = new URL(comicLink);
    InputStream is = (InputStream) url.getContent();
    image = Drawable.createFromStream(is, "src name");

    //finally puts the scraped information into the layout
    comicView.setImageDrawable(image);
    title.setText(comicTitle);
    htext.setText(hoverText);
}

Он работает на 100% нормально при вызове, но это немного медленнее, чем 3G, поэтому я попытался добавить ProgressDialog, чтобы показать, пока он загружается. Это моя попытка (это код, который запускается там, где я использовал просто comicReload ();)

pd = ProgressDialog.show(this, "Getting Comic", "Loading", true, false);
    new Thread(new Runnable() {  
           public void run() {
               try {
                   comicReload();
               } catch (IOException e) {
                   Log.i("ComicReloadFail","Sam");
               }
               pd.dismiss();
               return;
           }
    }).start();

Сам поток работает нормально, и когда я помещаю некоторый случайный код для выполнения вместо блока try-catch с помощью comicReload (), в нем все становится просто замечательно. Во-вторых, я помещаю туда comicReload (), однакозапуск приложения приводит к тому, что спиннер ProgressDialog будет вращаться в течение нескольких секунд, прежде чем сила приложения закроется. Что вызывает это? И почему comicReload () перестает работать, когда он находится в потоке. Я просто хочу, чтобы этот метод выполнялся скрутится, пока он работает.

Заранее спасибо, ребята, я знаю, что было много читать.

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Вы не можете ничего сделать с пользовательским интерфейсом в рабочем потоке.Вам нужно будет сделать это в потоке пользовательского интерфейса.Есть простые способы сделать это - вы можете позвонить, например, Activity.runOnUiThread().

1 голос
/ 09 декабря 2010

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

попробуйте использовать обработчик

public static final Handler handlerVisibility = new Handler() {
    public void handleMessage(Message msg) {
        int visibility = msg.getData().getInt("visibility");
        view.setVisibility(visibility);
    }
};
...