2014-09-29 2 views
0

Привет, у меня есть такая проблема. У меня есть ListView на клик, мне нужно сделать фоновое задание, поэтому мне нужно показать ProgressBar. Так что я бы то вроде этогоAndroid show progeress bar

 ListView list = (ListView) findViewById(R.id.list); 
     list.setVisibility(View.INVISIBLE); 
     ProgressBar bar = (ProgressBar) findViewById(R.id.progress_bar); 
     bar.setVisibility(View.VISIBLE); 
     FutureTask<City> task = new FutureTask<City>(new getWeather(city)); 
     ExecutorService executorService = Executors.newSingleThreadExecutor(); 
     executorService.submit(task); 
     City city1 = null; 
     try{ 
      city1 = task.get(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
     executorService.shutdown(); 
     //City city1 = City.getInstance(city); 
     list.setVisibility(View.VISIBLE); 
     bar.setVisibility(View.INVISIBLE); 

и моя задача:

public class getWeather implements Callable<City> { 
    String city; 
    public getWeather(String c) { 
     city = c; 
    } 
    @Override 
    public City call() throws Exception { 
     TimeUnit.SECONDS.sleep(2); 
     City city1 = new City(); 
     Bundle bundle = new Bundle(); 
     bundle.putString(City.CITY, city); 
     city1.setArguments(bundle); 
     return city1; 
    } 
} 

Но мой интерфейс не меняется, я вижу это: 09-29 11:20:10.455 29977-29977/com.example.mike.myapplication I/Choreographer﹕ Skipped 119 frames! The application may be doing too much work on its main thread.

Как я могу это исправить, спасибо.

ответ

2

Лучше использовать ProgressDiaolg вместо ProgressBar для выполнения такого рода задач. И было бы лучше, чтобы показать диалог прогресса в AsyncTask-х onPreExecute и освобождают от должности в onPostExecute

фрагмента коды:

ProgressDialog progressDialog 
//in onPreExecute 
progressDialog = new ProgressDialog(this); 
progressDialog.setMessage("Updating data.. Please wait"); 
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
progressDialog.setIndeterminate(true); 
progressDialog.setCancelable(false); 
progressDialog.show(); 

//After updating the data in onPostExecute 
progressDialog.dismiss(); 

Надеется, что это помогает.

1

Как вы получаете журнала: The application may be doing too much work on its main thread который означает, что вы пытаетесь изменить ход ProgressBar на главном потоке, попробуйте использовать Async Task

private class someAsyncClass extends AsyncTask<String, String, Void> { 
@Override 
protected Void doInBackground(String... params) { 
     //your code task here 

} 

@Override 
protected void onProgressUpdate(String... progress) { 
    super.onProgressUpdate(progress); 
    if (progressBar != null) { 
     //update progressbar here 
    } 
} 

}

Чтобы начать progrress бар асинхр задача:

ProgressBarAsyncTask pbTask = new ProgressBarAsyncTask(); 
pbTask.execute(); 

Взгляните на эту tutorial и это tutorial

0

onCreateMethod

новый LongOperation(). Execute();

private class LongOperation extends AsyncTask<String, Void, Void> 
{ 

    private String Content; 
    private String Error = null; 
    private ProgressDialog Dialog = new ProgressDialog(MG02DataSynchronize1.this); 
    protected void onPreExecute() { 

     Dialog.setMessage("Please wait.."); 
     Dialog.show(); 

    } 
     // Call after onPreExecute method 
    protected Void doInBackground(String... urls) { 



    } 

    protected void onPostExecute(Void unused) { 
     // NOTE: You can call UI Element here. 

     // Close progress dialog 
     Dialog.dismiss(); 



}