1

Ich habe versucht, meine Fortschrittsbalkenansicht in meiner Datei-Scanner-Anwendung zu arbeiten, und ich bin gründlich durch die richtige Kombination von Aktivitäten, Dienste, Threads und Handler ratlos.Update integrierten Fortschrittsbalken in ursprünglichen Aktivität

Hier ist die Struktur: Meine Aktivität enthält eine Horizontal-ProgressBar. Auf Menüpunkt klicken, spawn ich einen Service, der onCreate(), wo ich die Fortschrittsleiste aktualisieren möchte.

Meine Frage: Was vermisse ich?

  1. Aktivität "a" (mit ProgressBar)
                2. "a" .onOptionsItemSelected(): Spawn Service "b"
                                  3. "b" .onCreate(): Steuern Sie die ProgressBar in "a" // h ere ist, wo ich meine Probleme haben

Layout für die Progress Bar (1):

<ProgressBar 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_height="wrap_content" 
    android:max="100" 
    android:progress="0" 
    android:secondaryProgress="0" 
    android:layout_width="300px" 
    android:layout_marginLeft="10px" 
    android:id="@+id/progress_horizontal" 
    /> 

"a" .onOptionsItemSelected (2):

public boolean onOptionsItemSelected(MenuItem item) 
{ 
      if (svc == null) 
      { 
       android.util.Log.v("@@@@@@@@@@@@@@@@@@@@@", "starting"); 
       svc = new Intent(this, DoScan.class); 
       // done in "a".onCreate() 
          // hmap = new HashMap(); 
        // hmap.put("tv", tv); 
       svc.putExtra("hmap", hmap); 
       startService(svc); 
      } 
      break; 
} 

"b" .onCreate () (3):

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

    //startThread(); 
    TextView tv = (TextView) Peekaboo.hmap.get("tv"); 
    tv.append("cocktail"); 
} 
+0

Was ich suche ist eine Möglichkeit für die Aktivität mit dem Server zu kommunizieren .. – montooner

Antwort

0

stumpf sein, onCreate() Ihr Dienst ist ... problematisch:

  1. Versuchen Sie nicht, Widgets zu einem Dienst
  2. nicht Widgets ändern von einem Dienst versuchen zu passieren
  3. Versuchen Hintergrund-Threads zu verwenden, wenn mit Fortschrittsbalken

In Arbeit Bei den Begriffen 1 und 2 fragen Sie sich, was passiert, wenn der Benutzer den Bildschirm dreht (z. B. die Tastatur des G1 herauszieht), und die Widgets, die der Dienst hält, werden ungültig.

In Bezug auf # 3 erstellt das Starten eines lokalen Diensts nicht automatisch einen Hintergrund-Thread. Der Dienst wird im selben Thread wie die Aktivität und alle anderen Aktivitäten ausgeführt. Wenn Sie mit einem Hintergrundthread arbeiten möchten, verwenden Sie AsyncTask oder erstellen Sie einen Thread und verwenden Sie einen Handler oder post() oder postDelayed() oder runOnUiThread(), damit der Hintergrundthread die UI-Aktualisierungen im UI-Thread anordnet.

0

Ohne etwas Besonderes zu tun, läuft Ihr Programm in einem Thread, dem UI-Thread, dem UI-Thread des Betriebssystems. Alles, was in Ihrem Programm ausgeführt wird, wird im Benutzeroberflächenthread ausgeführt, es sei denn, Sie erstellen einen anderen Thread für die Ausführung. Dieser Thread muss den Fortschritt der Aufgabe an den Benutzeroberflächenthread weiterleiten (verwenden Sie die Klassen Runnable, Handler und Thread). Anschließend aktualisiert der Hauptthread der Benutzeroberfläche, was der Benutzer in der ProgressBar sieht.

Das Beste, was zu tun ist, dauert eine Stunde und arbeiten Sie durch die Beispiele des SDK-Threads.

Gute Orte zum Starten sind here und here.