2012-12-12 4 views
1

У меня есть некоторый контроль, и по этой причине я сделал несколько потоков. Я хочу показать загрузочную панель на один экран на другой экран с помощью asycntask. Моя проблема заключается в том, что загрузочная панель показывает и распаковывается быстро, а затем ждет того же экрана, не загружая панель . И через какое-то время идет второй экран. Я думаю, что post execute не работает для меня правильно. Может кто-нибудь мне помочь?onPostExecute() ждет слишком долго?

Это мой код:

private class ProgressBarAsync extends AsyncTask<Void, Integer, Void>{ 

     /** This callback method is invoked, before starting the background process */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      /** Creating a progress dialog window */ 
      mProgressDialog = new ProgressDialog(Login.this); 

      /** Close the dialog window on pressing back button */ 
      mProgressDialog.setCancelable(true); 

      /** Setting a horizontal style progress bar */ 
      mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 

      /** Setting a message for this progress dialog 
      * Use the method setTitle(), for setting a title 
      * for the dialog window 
      * */ 
      mProgressDialog = ProgressDialog.show(Login.this, 
        "Giriş yapıyorsunuz", "Lütfen bekleyin..."); 



     } 

     /** This callback method is invoked on calling execute() method 
     * on an instance of this class */ 
     @Override 
     protected Void doInBackground(Void...params) { 

      try { 
       startMyApplication() ; 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     /** This callback method is invoked when publishProgress() 
     * method is called */ 
     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
      mProgressDialog.setProgress(mProgressStatus); 
     } 

     /** This callback method is invoked when the background function 
     * doInBackground() is executed completely */ 
     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      if (mid > 0) { 
       Intent btn_login = new Intent(
         getApplicationContext(), MainScreen.class); 
       startActivity(btn_login); 
      } 
      else { 
       AlertDialog.Builder alertDialog = new AlertDialog.Builder(Login.this); 

       // Setting Dialog Title 
       alertDialog.setTitle("GİRİŞ"); 

       // Setting Dialog Message 
       alertDialog.setMessage("Kullanıcı adı veya Parola Hatalı Lütfen tekrar deneyin."); 

       // Setting Icon to Dialog 
       //alertDialog.setIcon(R.drawable.delete); 

       // Setting Negative "NO" Button 
       alertDialog.setNegativeButton("TAMAM", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 

         dialog.cancel(); 
        } 
       }); 

       // Showing Alert Message 
       alertDialog.show();   
      } 

      //run();      
      mProgressDialog.dismiss(); 

Это startmyapp theads:

public void startMyApplication() throws InterruptedException { 

    ExecutorService executor = Executors.newFixedThreadPool(2); 
    FutureTask<String> futureOne = new FutureTask<String>(
      new Callable<String>() { 
       public String call() throws Exception { 
        if (isOnline()) { 
         // Call Login Web Service with username and password and get mid 
         mid = callLoginWS(username.getText().toString(), password.getText().toString());        
         if (mid > 0) { 
          //callPasswordGeneratorWS(mid); 
          // Insert mid and username into sqllite 
          dbInstance.insertMerch(mid,username.getText().toString()); 
         } 
         Log.i("futureone", "futureone"); 

        } 
        return "TEST"; 
       } 
      }); 

    FutureTask<String> futureTwo = new FutureTask<String>(
      new Callable<String>() { 
       public String call() throws Exception { 
        // Get mid from database 
        mid = dbInstance.selectMerch(username.getText().toString()); 
        return "TEST"; 
       } 

      }); 



    // ... Dispatch 
    // Check if user exists previously 
    // ... Dispatch  
    mid = dbInstance.selectMerch(username.getText().toString()); 
    dbInstance.close(); 


    executor.execute(futureOne); 
    while (!(futureOne.isDone())) { 
     executor.execute(futureTwo); 
    } 
    Log.i("login","new login"); 
    //} 
    executor.shutdown(); 
} 
+0

Что находится внутри этой функции 'startMyApplication();' –

+0

Я отредактировал свой вопрос. – DuyguK

ответ

3

Этот раздел является причиной задержки.

while (!(futureOne.isDone())) { 
     executor.execute(futureTwo); 
    } 

Как здесь вы блокируете текущий поток для завершения. и ждет завершения futureOne.

0

Прежде всего, попытайтесь выполнить startMyApplication метод без ExecutorService. Когда вы запустите свой код в doInBackground, вы уже находитесь в другом потоке (исправьте меня, если я ошибаюсь), поэтому запустите свой код, не используя дополнительные потоки. Сделайте это и проверьте, все ли работает.

Кроме того, я заметил, что вы не называйте publishProgress (Прогресс ... значения) метод в любом месте на doInBackground метода. Таким образом, вы не можете опубликовать правильное значение для индикатора выполнения.

0

Если я не ошибаюсь. Вы запускаете startMyApplication() асинхронно, используя AsyncTask, поэтому зачем создавать FutureTask. Вы уже находитесь в фоновом задании. (Учитывая, в середине длинный) Попробуйте изменить ур код, как это,

public Long startMyApplication(){ 
     if (isOnline()) { 
      // Call Login Web Service with username and password and get mid 
      mid = callLoginWS(username.getText().toString(), password.getText().toString());        
      if (mid > 0) { 
       //callPasswordGeneratorWS(mid); 
       // Insert mid and username into sqllite 
       dbInstance.insertMerch(mid,username.getText().toString()); 
      } 
      Log.i("futureone", "futureone"); 

      } 
     mid = dbInstance.selectMerch(username.getText().toString()); //OR directly returning mid without fetching from db as it will be same. 
     return mid; 
    } 

Сейчас в doInBackground.

@Override 
protected Long doInBackground(Void...params) { 
      Long temp = -1l; 
      try { 
       temp = startMyApplication() ; 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return temp; 
} 

@Override 
protected void onPostExecute(Long mid) { 
mProgressDialog.dismiss(); //First dismiss the progress bar. 
//Rest of ur code will go same in this. Remember mid is now accessible correctly. 
} 

Изменить следующую строку,

private class ProgressBarAsync extends AsyncTask<Void, Integer, Void> 

по

private class ProgressBarAsync extends AsyncTask<Void, Integer, Long> 

Это может работать для вас, насколько я понял.

Смежные вопросы