2017-01-20 4 views
-5

Я разработал приложение, которое взаимодействует с облачными серверами. Теперь я хочу добавить обратную связь при загрузке данных. Например, пользователь нажимает кнопку «Получить данные» для загрузки данных, а текст кнопки должен быть изменен на «загрузка». И когда данные загружаются, текст снова становится «получать данные».Как визуализировать представление перед загрузкой данных

Однако первая попытка не сработала, и я провел некоторое исследование, потому что представление не будет отображаться, пока задача не будет завершена. (Я использовал AsyncTask для загрузки данных). И я нашел, что решение онлайн сообщает, что я должен отображать представление в методах onPreExecute() и onPostExecute(), поэтому я пробовал этот подход. Ну, это тоже не работает.

Похоже, что существует ограничение, заставляющее работу рендеринга выполняться только после завершения работы AsyncTask.

Может кто-нибудь просветить меня? Это беспокоило меня довольно долгое время.

+1

показать ваш код – meda

+0

просто установить текст «Загрузка ...» в onPreExecute на TextView и onPostExecute набор текста обратно в «получить данные» – 44kksharma

+0

я понял, проблема. Никогда не вызывайте AsyncTask.get(), так как он блокирует поток пользовательского интерфейса. Вызов AsyncTask.execute() достаточно, и обновления UI в postExecute(). –

ответ

0

Хотя я бы предложил Retrofit для облачных API-операций, если вы хотите использовать AsyncTask, тогда все в порядке. Я бы также предложил ProgressBar/Dialog скорее просто обновить некоторый текст.

вид не будет оказывать, пока задача не будет закончена

Неясная ...

Я нашел решение в Интернете сообщает, что я должен вынести мнение в onPreExecute() и onPostExecute(), поэтому я попробовал этот подход. Ну, это не работает, либо

Да, это будет работать, так что вы должны показать , что вы пытались.

, кажется, что существует ограничение, что заставляет работу рендеринга быть сделано только после того, как все AsyncTask закончили

Да, есть ограничение, которое вы не можете обновить пользовательский интерфейс вне UI нить. Вот почему существуют onPreExecute и onPostExecute.


Я могу гарантировать, что эти методы работают.

enter image description here

public class ButtonActivity extends android.support.v7.app.AppCompatActivity implements View.OnClickListener { 

    private Button button; 
    private ProgressBar pg; 

    @Override 
    protected void onCreate(Bundle b) { 
     super.onCreate(b); 
     setContentView(...); 

     button = (Button) findViewById(...); 
     button.setOnClickListener(this); 

     pg = (ProgressBar) findViewById(...); 
     setLoading(false); 
    } 

    private void setLoading(boolean loading) { 
     button.setText(loading ? "loading" : "get data"); 
     pg.setVisibility(loading ? View.VISIBLE : View.GONE); 
    } 

    @Override 
    public void onClick(View v) { 
     new BackgroundTask().execute(); 
    } 

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

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      setLoading(true); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       // some long operation 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { } 

      return null; 
     } 


     @Override 
     public void onPostExecute(Void result) { 
      setLoading(false); 
     } 
    } 
} 
+0

Спасибо за информацию. На самом деле, я пытаюсь использовать ProgressBar. Но я столкнулся с той же проблемой. Поскольку ProgressBar также является представлением, я решил, что будет одинаково демонстрировать текст кнопки. Проблема в том, что у вашего кода такая же проблема с моей, кнопка не будет отображаться до тех пор, пока не закончится AsyncTask, таким образом, button.setText («loading»); будет ждать завершения работы AsyncTask и нажать на метод onPostExecute(), который изменит текст назад, поэтому пользователь не будет иметь никаких видимых изменений. –

+0

Я не знаю, что вы подразумеваете под кнопкой, не отображается. XML определяет видимость, и я не переключил это. –

+0

Я имею в виду, что текст не будет обновлен до «загрузки» до тех пор, пока не закончится AsyncTask. Но когда он закончится, он немедленно выполнит метод onPostExecute() и снова обновит текст кнопки, чтобы «получить данные», что делает первое обновление заметным. –