1

だから私は自分が取り組んでいる小さなアプリを持っていて、それはウェブから漫画をこすり取って私の電話に表示します。ロープを学ぶためにそれを使用するだけで、特別なことは何もありません。combicReload();と呼ばれる関数。ほとんどの作業を実行し、アプリケーションで何度も呼び出されます(最初の実行時、およびユーザーが特定のボタンをクリックしたとき。関数は次のとおりです。

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();

スレッド自体は正常に実行され、comicReload()を使用してtry-catchブロックの代わりに実行するランダムコードを配置すると、その中ですべてがダンディになります。2番目にcomicReload()をそこに戻しましたが、アプリを実行すると、アプリの強制が閉じる前にProgressDialogスピナーが数秒間回転します。これを引き起こしているのは何ですか?そして、comicReload()がスレッド内にあるときに動作を停止するのはなぜですか。スピナーが機能している間にそのメソッドを実行する方法が必要です。

事前にみんなに感謝します、私はそれが読むことがたくさんあったことを知っています。

4

2 に答える 2

1

UIを作成したスレッドとは異なるスレッドでUI関連の更新を行うことはできません。

ハンドラーを使用してみてください

public static final Handler handlerVisibility = new Handler() {
    public void handleMessage(Message msg) {
        int visibility = msg.getData().getInt("visibility");
        view.setVisibility(visibility);
    }
};
于 2010-12-09T02:57:21.870 に答える
1

ワーカースレッドではUI関連の操作はできません。UIスレッドでそれを行う必要があります。これを行う簡単な方法がありますActivity.runOnUiThread()。たとえば、電話をかけることができます。

于 2010-12-09T02:57:46.337 に答える