1

あなたのために状況を要約しましょう:

  • ボタン (btnChooseEp) があり、それを押すと AlertDialog が表示されます。
  • AlertDialog で何かが選択されると、3 つの if ステートメントを評価する必要があります。
  • それらが評価されている間、ProgressDialog が表示されます。アプリが「ビジー」であることを示します。
  • これらのステートメントの評価後、ProgressDialog は消える必要があります。

私の問題はコードの下に記載されています。

コード ブロック全体を次に示します。

ProgressDialog getTracklistProgressDialog = null;

...

    Button btnChooseEp = (Button)findViewById(R.id.btnChooseEp);
    btnChooseEp.setOnClickListener(new OnClickListener()
    {           
        public void onClick(View v)
        {               
            final AlertDialog.Builder builder = new AlertDialog.Builder(GA.this);
            builder.setTitle(getText(R.string.chooseEpisode));
            builder.setItems(episodes, new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, final int pos)
                {                       
                    getTracklistProgressDialog = ProgressDialog.show(GA.this, "Please wait...",
                            "Retrieving tracklist...", true);

                    new Thread()
                    {
                        public void run()
                        {
                            try
                            {                       
                                String str1, epURL;

                                if(pos < 9)
                                {
                                    str1 = getResources().getString(R.string.epNo1);        
                                    epURL = String.format(str1, pos+1);
                                    setTracklist(epURL, tracklist);                 
                                }
                                else if(pos < 100)
                                {
                                    str1 = getResources().getString(R.string.epNo2);
                                    epURL = String.format(str1, pos+1);
                                    setTracklist(epURL, tracklist);
                                }
                                else if(pos >= 100)
                                {
                                    str1 = getResources().getString(R.string.epNo3);
                                    epURL = String.format(str1, pos+1);
                                    setTracklist(epURL, tracklist);
                                }
                            }
                            catch(Exception e)
                            {}

                            // Remove progress dialog
                            getTracklistProgressDialog.dismiss();                               
                        }
                    }.start();                          
                }
            });
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
        }
    });

必要かどうかはわかりませんが、関数 setTracklist のコードは次のとおりです。

public void setTracklist(String string, TextView tv)
{
    try
    {
        tv.setText(getStringFromUrl(string));
    }
    catch(Exception e)
    {
        e.printStackTrace();
    } 
}

関数 getStringFromUrl のコードは、http: //pastebin.com/xYt3FwaSで確認できます。

さて、問題: ProgressDialog のことを実装していなかったとき (ところで、ここから持っています: http://www.anddev.org/tinytut_-_displaying_a_simple_progressdialog-t250.html )、それはうまくいきました - setTracklist 関数インターネット上のテキスト ファイルから文字列を取得し、そのテキストを TextView に設定します。ここで、ProgressDialog コードを追加し、元のコードを try ステートメントに入れると、テキスト ファイルのごく一部 (約 22 ~ 24 文字) だけが TextView に追加されます。「忙しい」ProgressDialogは問題なく表示されます。以前は完全に機能していました。1300 を超える文字を TextView に読み込むことができました。それがスレッドと関係があるかどうかはわかりません-私はたくさんグーグルで検索しましたが、答えが見つかりませんでした.

では、ほんの一部ではなく、すべてのデータをロードするにはどうすればよいでしょうか?

(ちなみに、すべてのifステートメントの下に「setTracklist(epURL、tracklist);」という行を設定できるようにしたいのですが、「epURL」を解決できないと書かれています。同じことを書くのはばかげているようです行 3 回!)

現在のコードで 25/1 を更新:

final Handler uiHandler = new Handler();
final Button btnChooseEp = (Button)findViewById(R.id.btnChooseEp);
btnChooseEp.setEnabled(false);
btnChooseEp.setOnClickListener(new OnClickListener()
{           
        public void onClick(View v)
        {               
            builder.setTitle(getText(R.string.chooseEpisode));
            builder.setItems(episodes2, new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, final int pos)
                {                       
                    replay.setVisibility(View.VISIBLE);
                    replayWeb.setVisibility(View.VISIBLE);

                    getTracklistProgressDialog = ProgressDialog.show(GA.this, "Please wait...",
                            "Retrieving tracklist...", true);

                    new Thread()
                    {
                        public void run()
                        {
                            try
                            {                       
                                String str1, epURL;

                                if(pos < 9)
                                {
                                    str1 = getResources().getString(R.string.gaEpNo1);      
                                    epURL = String.format(str1, pos+1);
                                    setTracklist2(epURL, tracklist);                    
                                }
                                else if(pos < 100)
                                {
                                    str1 = getResources().getString(R.string.gaEpNo2);
                                    epURL = String.format(str1, pos+1);
                                    setTracklist2(epURL, tracklist);
                                }
                                else if(pos >= 100)
                                {
                                    str1 = getResources().getString(R.string.gaEpNo3);
                                    epURL = String.format(str1, pos+1);
                                    setTracklist2(epURL, tracklist);
                                }
                            }
                            catch(Exception e)
                            {}

                            // Remove progress dialog
                            uiHandler.post(new Runnable()
                            { 
                                public void run()
                                { 
                                    getTracklistProgressDialog.dismiss();                                       
                                }
                            }
                            );                              
                        }
                    }.start();                          
                }
            });
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
        }
    });

public void setTracklist2(final String string, final TextView tv)
{
    try
    {
        uiHandler.post(
                new Runnable()
                {
                    public void run()
                    {
                        try
                        {
                            tv.setText(getStringFromUrl(string));
                        }
                        catch (UnsupportedEncodingException e)
                        {
                            e.printStackTrace();
                        }
                    }
                });
    }
    catch(Exception e)
    {
        e.printStackTrace();
    } 
}

注: 「replay」と「replayWeb」は 2 つの TextView にすぎません。「btnChooseEp」は、別のボタンが押されたときに有効になります。

4

1 に答える 1

2

私の推測では、UI以外のスレッドでUIメソッドを呼び出しているため、奇妙な動作が発生していると思います。getTracklistProgressDialog.dismiss();
UIスレッドで実行する必要があります。私の推測では、それはクラッシュしていて、スレッドはクラッシュしていて、リソースの一部が悪い状態のままになっていると思います。これは、さまざまな量の文字を取得する理由を説明します。

uiThreadにバインドされるonCreateメソッドで最終的なハンドラーを作成してみます。そのスレッドで、あなたはそれから呼び出すことができます

uiHandler.post( 
 new Runnable() { 
  public void run(){ 
    getTracklistPRogressDialog.dismiss();
  }
 }
);

これは速いので、構文的に正しくない可能性があります。IDEを確認してください。

これはあなたが投稿したものから私が得ることができる最高のものです。あなたがより多くのコードを投稿するならば、私はあなたにもっと助けを与えるためにそれを実行することを試みることができます。

アップデート:

私はあなたの問題を見つけたと思います:

別のスレッドを持つという考えは、そこで長時間実行される作業を行うことですが、現在私たちが持っているのは、実際には、私たちの目標とは逆に、uiスレッドで長時間実行される作業を行うことです。私たちがする必要があるのはgetStringFromUrl(url)、setTracklist呼び出しからスレッドに呼び出しを移動することです。setTracklistを次のように書き直します。

public void setTracklist(String tracklistContent, TextView tv)
{
    try
    {
      runOnUiThread(
        new Runnable() {
          public void run() {
            tv.setText(tracklistContent);
          }
         });
    }
    catch(Exception e)
    {
        e.printStackTrace();
    } 
}

次に、内側のonClickメソッドで、次のようにします。

            public void onClick(DialogInterface dialog, final int pos)
            {                       
                getTracklistProgressDialog = ProgressDialog.show(GA.this, "Please wait...",
                        "Retrieving tracklist...", true);

                new Thread()
                {
                    public void run()
                    {
                        try
                        {                       
                            String str1, epURL;

                            if(pos < 9)
                            {
                                str1 = getResources().getString(R.string.epNo1);        
                                epURL = String.format(str1, pos+1);
                                String tlContent = getStringFromUrl(epUrl);
                                setTracklist(epURL, tracklist);                 
                            }
                            else if(pos < 100)
                            {
                                str1 = getResources().getString(R.string.epNo2);
                                epURL = String.format(str1, pos+1);
                                String tlContent = getStringFromUrl(epUrl);
                                setTracklist(epURL, tracklist);
                            }
                            else if(pos >= 100)
                            {
                                str1 = getResources().getString(R.string.epNo3);
                                epURL = String.format(str1, pos+1);
                                String tlContent = getStringFromUrl(epUrl);
                                setTracklist(epURL, tracklist);
                            }
                        }
                        catch(Exception e)
                        {}

                        // Remove progress dialog
                        getTracklistProgressDialog.dismiss();                               
                    }
                }.start();                          
            }

そうです、UIスレッドの実行を再開する前に、Webサービス/URLを呼び出します。長時間実行されているインターネット検索はbgスレッドで実行され、その後uiの更新がuiスレッドで行われます。これが役立つはずだと思います。

于 2011-01-20T23:22:21.317 に答える