あなたのために状況を要約しましょう:
- ボタン (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」は、別のボタンが押されたときに有効になります。