2017-02-01 11 views
0

Я сделал очень простое приложение. В основном у меня есть активность A, которая запускает действие B, если кнопка нажата. Итак, вот кодAndroid startactivity freezes приложение

openMapFAB.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getActivity(), MapActivity.class); 
       intent.putExtra("routeId", id); 
       startActivity(intent); 
      } 
     }); 

Но вот в чем проблема. активность B очень тяжелая (она в основном открывает карту (mapsforge) и выполняет другие тяжелые вычисления). Поэтому при нажатии кнопки мой пользовательский интерфейс замерзает около 4 секунд, а затем я активирую активность B. Я хотел бы показать некоторую анимацию, например, индикатор хода круга или что-то в этом роде. Так можно ли начать работу не в потоке пользовательского интерфейса?

Вот что я пытался до сих пор

new Thread(new Runnable() { 
        @Override 
        public void run() { 
         while (progressStatus < 100) { 
          progressStatus += 25; 
          handler.post(new Runnable() { 
           @Override 
           public void run() { 
            //animation code 
           } 
          }); 

          try { 
           Thread.sleep(1600); 
           if (progressStatus == 100){ 
            Intent intent = new Intent(getActivity(), MapActivity.class); 
            intent.putExtra("routeId", id); 
            startActivity(intent); 
           } 

          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }).start(); 

Однако это не совсем то, что мне нужно. Любые решения или предложения?

+0

Если тяжелый код находится внутри MapActivity, это не сработает. Вы должны попытаться реорганизовать MapActivity для перемещения кода, например. потоки или асинтесы. Добавьте код для MapActivity, если вам нужна помощь – mlidal

ответ

0

попробовать этот код:

использовать Asynctask, чтобы показать progressDialog в течение 5 секунд и начать новую деятельность в onPostExecute()

openMapFAB.setOnClickListener(new View.OnClickListener() { 
public void onClick(View view) { 
    new AsyncTask<Integer, Long, Boolean>() 
    { 
     ProgressDialog pd; 

     @Override 
     protected Boolean doInBackground(Integer... params) 
     { 
      pd = new ProgressDialog(Your_Activity.this); 
      pd.setMessage("Loading ..."); 
      pd.setMax(params[0]); 
      pd.setIndeterminate(false); 

      publishProgress(0L); 

      long start = System.currentTimeMillis(); 
      long waitTime = params[0] * 1000; 
      try 
      { 
       while (System.currentTimeMillis() - start < waitTime) 
       { 
        Thread.sleep(500); 
        publishProgress(System.currentTimeMillis() - start); 
       } 
      } 
      catch (Exception e) 
      { 
       return false; 
      } 

      return true; 
     } 

     @Override 
     protected void onProgressUpdate(Long... values) 
     { 
      if (values[0] == 0) 
      { 
       pd.show(); 
      } 
      else 
      { 
       pd.setProgress((int) (values[0]/1000)); 
      } 
     } 

     @Override 
     protected void onPostExecute(Boolean result) 
     { 
      pd.dismiss(); 
      //start new activity here 
      Intent intent = new Intent(Your_Activity.this, activity2.class); 
      startActivity(intent); 
     } 
    }.execute(5); // show progress dialog for 5 seconds 
}); 
0

1) Итак, можно начать деятельность не в потоке пользовательского интерфейса

Деятельность должна обрабатываться только в главном пользовательском интерфейсе. Вы не сможете начать работу в других потоках. Даже после обработки данных в фоновом потоке, для вызова или толкания активности методы, как runOnUiThread используется

При выполнении длительных операций в основном потоке, Android выбросит ANR

2) Однако это не совсем Что мне нужно. Любые решения или предложения ?

Теперь альтернативный подход, чтобы сделать тяжелые операции вашей деятельности в фоновом режиме, используя AsyncTask или IntentService и показать прогресс бар, пока эти операции не будут завершены.

Как только эта операция будет завершена, опубликуйте данные в MapActivity.

1) Sample Intent Service implementation

2) Sample AsyncTask example

Образец AsyncTask на OnCreate будет следующим

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     new BackAsync().execute("URL"); 
} 
private String getURLDetailsTitle(String url) { 
    //Retrieve data from external URL 
} 
//AsyncTask to fetch data from URL called inside onCreate 
private class BackAsyncextends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... urls) { 
     String str = getURLDetailsTitle(urls[0]); 
     while(true) { 
      publishProgress(str); 

     } 
     return str; 
    } 

    @Override 
    protected void onProgressUpdate(String... progress) { 
     //update progress 
    } 

    protected void onPostExecute(Long result) { 
     //update UI changes 
    } 
0

Используйте AsyncTask и начать прогресс бар в методе doInBackground и закрыть его в onPostExecute метод.