ネットワーク呼び出しを待っている間に、非常に単純なローディング ホイールを実装しようとしていたので、非常にイライラしています。私は何十ものSOの質問を検索して読んだことがあります. AsyncTask
ルートをたどってみましたが、それは私が望むものではありません。
また、現在、私のアプリは完全に機能していますが、ネットワーク上で待機しているときに、画面から画面への遷移がハングしているように見えるだけです。ユーザーがアプリが動作していてフリーズしていないことを1〜2秒で知ることができるように、ロードホイールが必要です。
現在のネットワーク呼び出しは次のようになります。
private static String sendDataToServer(String arg1, String arg2)
{
Thread dbThread = new Thread()
{
public void run()
{
// do the call that takes a long time
}
};
dbThread.start();
try {
// I do this so that my program doesn't continue until
// the network call is done and I have received the information
// I need to render my next screen
dbThread.join();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
では、なぜProgressDialog
このように追加できないのでしょうか。これを行うと、progressDialog は表示されません。
private static String sendDataToServer(String arg1, String arg2)
{
final ProgressDialog progress = new ProgressDialog(BaseActivity.getInstance());
progress.setIndeterminate(true);
progress.setMessage("Loading...");
progress.show();
Thread dbThread = new Thread()
{
public void run()
{
// do the call that takes a long time
}
};
dbThread.start();
try {
dbThread.join();
progress.dismiss();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
ネットワーク呼び出しは UI スレッドとは別のスレッドで行う必要があるため、行き詰まっていると思いますが、続行するにはその呼び出しの結果が必要なため、アプリケーションを続行したくありません。しかし、私がそうするなら、私はthread.join()
すべてを保持します。必要だと思ってAsyncTask
いましたが、すぐに下り坂になりました。興味があれば、これが私の質問です。
Android の AsyncTask: 複数のパラメーター、戻り値、待機
この呼び出しが発生しているときに、アプリケーションの残りの部分を続行せずに、読み込みダイアログを表示するだけです。
編集
これが私のAsyncTask
試みです。
private class PostToFile extends AsyncTask<PostToFile, Void, Void>{
private String functionName;
private ArrayList<NameValuePair> postKeyValuePairs;
private String result = "";
public PostToFile(String function, ArrayList<NameValuePair> keyValuePairs){
functionName= function;
postKeyValuePairs = keyValuePairs;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(BaseActivity.getInstance(), "Loading", "Please wait...", true, false);
}
@Override
protected Void doInBackground(PostToFile... params) {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair(FUNCTION_KEYWORD, functionName));
for (int i = 0; i < postKeyValuePairs.size(); i++) {
nameValuePairs.add(postKeyValuePairs.get(i));
}
try{
// ***do the POST magic.***
result = response.toString();
}
catch (Exception e){
// clean up my mess
}
return null;
}
private String getResult(){
return result; // can I use this somehow???
}
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
}
}
そして、私がそれを使用するとき:
new PostToPHP(FUNCTION_NAME, postPairings){
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
try
{
if (result != null && !result.startsWith("null"))
{
JSONArray jArray = new JSONArray(result);
parseData(jArray);
}
}
catch (JSONException e)
{
Log.e(Constants.LOG_TAG, e.toString());
}
};
}.execute()
問題は、これらの呼び出しが連続していくつかあり、それぞれが互いに依存していることです。したがって、最初の 1 つが開始され、最初の 1 つが開始された直後に 2 つ目が開始されますが、最初の 1 つが終了する前に. だから私は間違った行動をします。最初の通話が完全に終了した後でのみ、2 番目の通話を開始するにはどうすればよいですか?