2017-04-30 19 views
1

私はHttpConnectionを開き、doInBackground機能でJSONをダウンロードするためにAsyncTaskを実行しています。Android ProgressDialogの終了が遅すぎる

は、ここに私のAsyncTaskです:

public class AsyncQueryTask extends AsyncTask<URL, Void, String>{ 
    String jsonString = ""; 
    ProgressDialog progressDialog; 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog = new ProgressDialog(LoginActivity.this); 
     progressDialog.setCancelable(false); 
     progressDialog.setMessage("Getting Ready..."); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progressDialog.setProgress(0); 
     progressDialog.show(); 
    } 

    @Override 
    protected String doInBackground(URL... urls) { 
     URL restURL = urls[0]; 
     try { 
      //-------------------------------------------- 
      // Some initialization 
      //-------------------------------------------- 
      HttpURLConnection urlCon = (HttpURLConnection) restURL.openConnection(); 
      InputStream in = urlCon.getInputStream(); 
      Scanner scan = new Scanner(in).useDelimiter("\\A"); 
      jsonString = scan.hasNext()? scan.next() : ""; 

      try{ 
       JSONArray bookArr = new JSONArray(jsonString); 
       for(int i=0;i<bookArr.length();i++){ 
        // Some JSON string processing... 
       } 

      } catch(Exception e){ 
       Log.e("Err", "@Activity"); 
       e.printStackTrace(); 
      } 
      //---------------------------------------------------- 

      return jsonString; 
     } catch(IOException ioe){ 
      ioe.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     progressDialog.dismiss(); 
    } 
} 

そして、私はここでそれを呼び出す:onPostExecute()でそれをあなたが見ることができるように、私はonPreExecute()で正しくprogressDialogを初期化

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     URL url = // URL for fetching JSON string 
     if (/*Some condition*/) { 
      //---------------------------------------------- 
      // Some other tasks 
      //---------------------------------------------- 
      AsyncQueryTask fbqt = new AsyncQueryTask(); 
      fbqt.execute(url); 

      Intent intent = new Intent(context, NextActivity.class); 
      startActivity(intent); 
     } 
    } 

、およびdismiss()

問題進捗ダイアログは第二の一部分のみのために表示されることであり、それは直ちに完全doInBackground()セクションにそれが有しているタスクを実行することなく、次のアクティビティに転送するアプリを引き起こし、終了します。

doInBackground()スレッドが完了するまでprogressDialogを最後にするにはどうすればよいですか?

答えて

0

私はそれは、このためだと思う:

AsyncQueryTask fbqt = new AsyncQueryTask(); 
fbqt.execute(url); 

Intent intent = new Intent(context, NextActivity.class); 
startActivity(intent); 

あなたはLoginActivityProgressDialogをlunchingされているが、ちょうどあなたがfbqtを実行した後に一時停止サイクルにLoginActivityを置く別のアクティビティ(NextActivity)を起動し、だから私はこれを推測ダイアログを閉じます!


注:私はあなたのコードのロジックを理解していないが、私はあなたがはい、あなたが実装するのはどのような間違っている場合は、コールバックを取得するためのインターフェイスを使用する必要があり、fbqtから結果を取得した後NextActivityを起動しようとしていると思いますAsyncTaskから、NextActivityを起動してください。

+0

私はAsyncTaskを実行した後、LoginActivityはすでにで終わっており、次のアクティビティを開始する必要があります。 AsyncTaskの実行後に 'startActivity()'関数を呼び出せない場合はどこで呼び出すべきですか? – JeobMallari

+0

@JeobMallariしかし、あなたはasynckタスクが終了した後、 'NextActivity'を起動する必要がありますか?私はそれが終了し、 'NextActivty'を起動するまで待つことを希望しますか? –

+0

@JeobMallariこれをチェックしてください[回答](http://stackoverflow.com/a/43690935/5993410) –

1

あなたの方法はウィンドウリークを引き起こす可能性があります。 Intent intent = new Intent(context, NextActivity.class); startActivity(intent); 上記のコードをonPostExecute()メソッドに入れてください。

関連する問題