2013-09-25 3 views
2

Мне нужно обработать некоторые данные, когда пользователь нажимает кнопку в одном действии, поэтому экран выглядит как приложение останавливается на 2-3 секунды. Это не так много, но я хочу дать пользователю информацию о том, что все в порядке, а ИМО - лучший путь, который будет отображаться только при обработке данных.Видимость ProgressBar

Я нашел код ProgressBar и это выглядит следующим образом:

<ProgressBar 
    android:id="@+id/loadingdata_progress" 
    style="?android:attr/progressBarStyle" 
    android:layout_width="50dp" 
    android:layout_height="50dp" 
    android:layout_alignBottom="@+id/fin2_note" 
    android:layout_centerHorizontal="true" 
    android:indeterminate="true" 
    android:visibility="invisible" /> 

и вставить его на середине моего макета.

И попробовать, если ProgressBar работает, я ставлю этот код

loadingimage= (ProgressBar) findViewById(R.id.loadingdata_progress); loadingimage.setVisibility(View.VISIBLE);

в onCreate метод и все выглядит нормально. Затем я воссоздал код, чтобы показать этот индикатор прогресса только в том случае, если данные обработаны.

После клика пользователь вызвать этот метод

public void fin2_clickOnFinalization(View v) 
    {  

      loadingimage= (ProgressBar) findViewById(R.id.loadingdata_progress); 
    loadingimage.setVisibility(View.VISIBLE); 

      // code where data is processing 
      loadingimage.setVisibility(View.INVISIBLE); 
     } 

и ничего появляющимся на экране. Я не знаю, где ошибка. Если я обнаружил индикатор выполнения по id, для меня странно, что я могу контролировать его в методе onCreate, но в методе onclick он вышел из моего контроля.

+0

Пожалуйста вставьте полный файл XML, в котором ProgressBar закодированы –

+0

Я не» t думаю, что ошибка была в файле xml, потому что когда индикатор выполнения был установлен на видимый в onCreate, все работает – MyWay

ответ

5

Ваш поток UI не может показать прогресс бар потому что занят из-за ваша обработка данных. Попробуйте использовать этот вид кода:

public void fin2_clickOnFinalization(View v) { 

    new YourAsyncTask().execute(); 
} 

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

    @Override 
    protected Void doInBackground(Void... args) { 
     // code where data is processing 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) {   
     loadingimage.setVisibility(View.INVISIBLE); 
     super.onPostExecute(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     loadingimage.setVisibility(View.VISIBLE); 
    } 
} 

EDIT:

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

3

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

Чтобы исправить это, переместите свой код обработки в отдельный поток или AsyncTask. Затем вы можете установить индикатор выполнения на видимый, запустить задачу и сделать ее невидимой, как только это будет сделано.

Я бы порекомендовал AsyncTask для этой цели около 90% времени на Android, так как он поставляется с полезными обратными вызовами. Руководство разработчика для него (в Javadoc, приведенном выше) довольно явное и описывает все шаги, которые вам нужно предпринять.

+0

thx для этого сообщения, я ищу ссылку, и это помогает мне создать мой собственный класс;) – MyWay

1

Вы можете попытаться создать глобальную ProgressDialog не в макете, но в своей деятельности, как:

public class MyActivity { 

ProgressDialog progress = null; 

protected void onCreate(...) { 
    progressDialog = new ProgressDialog(this); 
    progressDialog.setCancelable(false); 
    progressDialog.setTitle("Progress"); 
} 

public void fin2_clickOnFinalization(View v) 
{  
    progress.show(); 
    // code where data is processing 
    progress.dismiss(); 
} 

} 

Надежда я это помогает

+0

что делать, если пользователь Закрыть s активность во время обработки данных? Я думаю, что создание и отклонение диалога должно выполняться после проверки, находится ли действие на переднем плане или иначе оно будет выполняться через исключение IllegalArgument Exception или исключение BadTokenException, если этого не происходит – rd7773

1

AsyncTask слишком тяжелый вес для такой задачи.

Лучше много решение

Handler handler = new Handler(getMainLooper()); 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
     loadingimage.setVisibility(View.VISIBLE); 
    } 
}); 

Или еще проще (делает по существу то же самое, как раствор выше)

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     loadingimage.setVisibility(View.VISIBLE); 
    } 
}); 
Смежные вопросы