2014-11-12 3 views
1

Я создаю приложение, которое генерирует и добавляет представление динамически. Я не знаю заранее, какие виды мне нужно создавать, это могут быть вложенные макеты или простые ярлыки и т. Д., В зависимости от того, что возвращается из веб-служб.Добавление вложенных представлений динамически зависает App

Все было хорошо до тех пор, пока я не начал создавать действительно сложные вложенные макеты. У меня есть один случай, когда мне нужно добавить около 11 уровней макетов динамически. Когда активность начинается, я показываю ProgressDialog (ring), в то время как создается представление. Моя проблема в том, что с этой сложной структурой ProgressDialog зависает, пока добавляются представления. Это код, который создает вид:

private class ViewCreator implements Runnable { 

    public BackgroundTaskViewCreatedResponse delegate; 
    private View mCreatedView; 
    private ComponentDefinition mComponent; 

    private ViewCreator(ComponentDefinition component){ 
     this.mComponent = component; 
    }  

    @Override 
    public void run() { 
     try { 
      if (mComponent != null){ 
       mComponent.setLinkedData(model.getLinkedData()); 
       mCreatedView = componentCreator.createComponent(mComponent); 
      } 
     } finally { 
      if (mCreatedView != null) 
       delegate.processFinishTask(mCreatedView); 
     } 
    } 
} 

Layout, который имеет другие представления в нем реализует BackgroundTaskViewCreatedResponse, поэтому, когда вид готов, он будет добавлен:

@Override 
public void processFinishTask(final View createdView) { 
    //((Activity)view.getContext()).runOnUiThread(new Runnable(){ 
    mView.post(new Runnable(){ 
     @Override 
     public void run() { 
      mView.addView(createdView); 
     } 
    }); 
} 

Как вы можете см. выше, я попытался вызвать вызов runOnUiThread, но это полностью блокирует поток пользовательского интерфейса, пока создается иерархия представления. В то же время view.post не вызывается из коробки, поэтому я внес некоторые изменения в представления, как это предложено в this SO answer. Итак, теперь мои взгляды добавлены, но мой ProgressDialog работает не плавно. Он останавливается в нескольких случаях, а затем возобновляется. Я также пробовал использовать Android AsyncTask, но при этом тот же эффект, что и runOnUiThread

Я не очень опытен с Threads, пытаюсь исправить это в течение нескольких дней. Пожалуйста помоги.

+1

'Я не очень опытный с Threads' <= вы должны это исправить ... но сначала использовать некоторые профилирования инструмент и проверить, что занимает большую часть времени ... – Selvin

+0

@Selvin: Спасибо, Я уже пытался использовать StrictMode и, похоже, не имел никаких нарушений правил. В настоящее время вы пытаетесь использовать это: http://developer.android.com/tools/debugging/debugging-tracing.html. Есть ли что-нибудь еще, что вы могли бы предложить? – etilia

ответ

0

Вы можете использовать AsyncTask, чтобы сделать это/Вот пример:

private class GenerateViews extends AsyncTask<Void,Void,Void>{ 

    @Override 
    protected void onPreExecute() { 
     // SHOW THE SPINNER WHILE GENERATING VIEWS 
     spinner.setVisibility(View.VISIBLE); 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     //CALL YOUR VIEW GENERATING METHOD HERE 

     return null; 
     } 

    @Override 
    protected void onPostExecute(Void result){ 

     spinner.setVisibility(View.INVISIBLE); 

    } 
} 

Вы можете сделать этот класс в своем классе, если вы хотите. И потом, вы просто звоните

new GenerateCalls.execute(); 
+0

Я уже пытался использовать его, спасибо. Он блокирует потоки даже хуже, чем у меня на данный момент. – etilia

+0

это странно .. ну, если вы найдете способ, который делает трюк, напишите свой ответ здесь. Я хотел бы знать :) – SteBra

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