2010-12-16 9 views
0

Ich versuche Fortschritt Dialog zu zeigen, während das Layout Füllung:

EDIT (hier ist der Code):

public class CalendarMonth extends Activity { 

    private ProgressDialog mDialog; 

     private int mMonth = 0; 
    private int mYear = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.calendar_m); 

     filterData(); 
    } 

    private void filterData() { 

     mDialog = ProgressDialog.show(this, "Loading calendar", 
       "Please wait...", true, true); 
     mDialog.setCancelable(false); 
     mDialog.show(); 

     new GenerateMonth().execute(); 
    } 

class GenerateMonth extends AsyncTask { 
     protected Object doInBackground(Object... arg0) { 
      generateMonth(); 
      return true; 
     } 
     protected void onPostExecute(Object result) { 
      mDialog.dismiss(); 
     } 

    private void generateMonth() { 

     mCalendar = new CalendarInstance(mMonth, mYear); 

     mMonth = this.mCalendar.getSelectedMonth(); 
     mYear = this.mCalendar.getSelectedYear(); 

     TextView monthName = (TextView) findViewById(R.id.monthName); 
     monthName.setText(mCalendar.getMonthAndYearAsString()); 

     Button monthPrevious = (Button) findViewById(R.id.monthPrevious); 
     monthPrevious.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       int month = mMonth - 1; 
       int year = mYear; 
       if (mMonth == 1) { 
        month = 12; 
        year = mYear - 1; 
       } 
       mMonth = month; 
       mYear = year; 
       filterData(); 
      } 
     }); 

     Button monthNext = (Button) findViewById(R.id.monthNext); 
     monthNext.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       int month = mMonth + 1; 
       int year = mYear; 
       if (mMonth == 12) { 
        month = 1; 
        year = mYear + 1; 
       } 
       mMonth = month; 
       mYear = year; 
       filterData(); 
      } 
     }); 

     GridView gridview = (GridView) findViewById(R.id.gridview); 
     gridview.setNumColumns(7); 
     gridview.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); 
     gridview.setBackgroundColor(Color.BLACK); 
     gridview.setAdapter(new CalendarMonthAdapter(this, mMonth, mYear));  
    } 

    @Override 
    protected void onResume() { 

     super.onResume(); 
     filterData(); 
    } 
    } 

Antwort

0

Der Fehler in filter sein muss Wenn Sie die Benutzeroberfläche aus Filterdaten aktualisieren, wird diese Ausnahme angezeigt. Ich würde empfehlen, Async-Aufgabe zu verwenden, mit DoInBackground, um die Daten zu erstellen, und OnPostExecute, um die Benutzeroberfläche zu aktualisieren.

+0

Ich benutze BaseAdapter, die eine Gridview von Button erstellt. Ich möchte Dialog ablehnen, wenn das GridView erstellt wird. Ich habe versucht, Asynctask zu verwenden (die eine sim hat gepostet), aber ich bekomme RuntimeException –

1

könnte es einfacher sein, eine AsyncTask zu verwenden http://developer.android.com/reference/android/os/AsyncTask.html

so würden Sie so etwas wie dieses

public class Temp extends Activity { 
    private Context mContext; 
    private ProgressDialog mDialog 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.temp); 


     mDialog = ProgressDialog.show(this, "Filter", "blah", true, true); 
     mDialog.show(); 
     new FillDataTask.execute(); 

    } 


    class FillDataTask extends AsyncTask { 
     @Override 
     protected Object doInBackground(Object... params) { 

      try { 
        filterData(); 
       } catch (ParseException e) { 
        Log.e("FILTER", e.toString()); 
        e.printStackTrace(); 
       } 
      return true; // you can return whatever you want here 
     } 

     protected void onPostExecute(Object result) { 
      //update progressDialog here 
      mDialog.dismiss(); 
     } 
    } 

} 

EDIT haben BELOW

es tun wie dieses

public class CalendarMonth extends Activity { 

    private ProgressDialog mDialog; 

     private int mMonth = 0; 
    private int mYear = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.calendar_m); 

     filterData(); 
    } 

    private void filterData() { 

     mDialog = ProgressDialog.show(this, "Loading calendar", 
       "Please wait...", true, true); 
     mDialog.setCancelable(false); 
     mDialog.show(); 

     new GenerateMonth().execute(); 
    } 

    private void genMonth() 
    { 

     mCalendar = new CalendarInstance(mMonth, mYear); 

     mMonth = this.mCalendar.getSelectedMonth(); 
     mYear = this.mCalendar.getSelectedYear(); 

    } 

    private void layoutUI() 
    { 
      TextView monthName = (TextView) findViewById(R.id.monthName); 
     monthName.setText(mCalendar.getMonthAndYearAsString()); 

     Button monthPrevious = (Button) findViewById(R.id.monthPrevious); 
     monthPrevious.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       int month = mMonth - 1; 
       int year = mYear; 
       if (mMonth == 1) { 
        month = 12; 
        year = mYear - 1; 
       } 
       mMonth = month; 
       mYear = year; 
       filterData(); 
      } 
     }); 

     Button monthNext = (Button) findViewById(R.id.monthNext); 
     monthNext.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       int month = mMonth + 1; 
       int year = mYear; 
       if (mMonth == 12) { 
        month = 1; 
        year = mYear + 1; 
       } 
       mMonth = month; 
       mYear = year; 
       filterData(); 
      } 
     }); 

     GridView gridview = (GridView) findViewById(R.id.gridview); 
     gridview.setNumColumns(7); 
     gridview.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); 
     gridview.setBackgroundColor(Color.BLACK); 
     gridview.setAdapter(new CalendarMonthAdapter(this, mMonth, mYear)); 
    } 
} 
} 

class GenerateMonth extends AsyncTask { 
     protected Object doInBackground(Object... arg0) { 
      genMonth(); 
      return true; 
     } 
     protected void onPostExecute(Object result) { 
      layoutUI(); 
      mDialog.dismiss(); 

     } 

    } 
+0

Vielen Dank für die Antwort, aber wenn ich diesen Code RuntimeException verwendet wird :( –

+0

können Sie Ihren Code und den Fehler, tun Sie nichts tun mit der UI in der DoBackground -Funktion? Wenn ja, sollten Sie nichts mit der Benutzeroberfläche dort tun, warten Sie, bis Sie auf die OnPostExecute-Funktion, um etwas UI – slim

+0

Post 'filterData()' so können wir helfen .. – blindstuff

0

Es scheint, Das Problem liegt in der Funktion generateMonth, die von do aufgerufen wird InBackground-Funktion. Sie sollten nicht über die doInBackground-Funktion oder eine Funktion, die von doInBackground aufgerufen wird, auf die Benutzeroberfläche zugreifen. Diese Funktion zielt auf Tasks ab, die viel Zeit benötigen, wie Berechnungen oder komplexe DB-Abfragen, darf aber NICHT auf die Benutzeroberfläche zugreifen. Ihre UI-Updates sollten in der Funktion onPostExecute durchgeführt werden. Also Dinge wie:

gridview.setNumColumns (7)

sind nicht in doInBackground (oder generateMonth, die von dort aus aufgerufen wird) erlaubt.