2010-12-01 2 views
2

У меня возникли серьезные проблемы при показе ProgressDialog, когда служба готовится ... Для получения готовой услуги требуется время, так как это немного тяжело, поэтому я хочу показать ProgressDialog тем временем он запущен.Отображение ProgressDialog при запуске службы

Дело в том, что она показывает ProgressDialog перед началом следующего действия ... Я действительно не нахожу, что это такое ...

package org.pfc; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.BroadcastReceiver; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 


public class ConnectActivity extends Activity { 

    // FIELDS------------------------------------------------------------------ 

    protected LocalService mSmeppService; 
    private ProgressDialog progressDialog; 

    private Thread tt; 

    private ServiceConnection mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      // Gets the object to interact with the service 
      mSmeppService = ((LocalService.LocalBinder) service).getService(); 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      // This is called when the connection with the service has been 
      // unexpectedly disconnected -- that is, its process crashed. 
      // Because it is running in our same process, we should never 
      // see this happen. 
      mSmeppService = null; 
     } 
    }; 

    // For getting confirmation from the service 
    private BroadcastReceiver serviceReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.i(TAG, "receiver onReceive..."); 

      if (progressDialog.isShowing()) 
       progressDialog.dismiss(); 

      // Change activity 
      Intent groupsActivityIntent = new Intent(ConnectActivity.this, 
        GroupsActivity.class); 
      startActivity(groupsActivityIntent); 
     } 
    }; 

    // METHODS ---------------------------------------------------------------- 

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

     if (LocalService.isRunning) { 
      // TODO start ListActivity 
      Log.i(TAG, "Starting GroupsScreen"); 

      Intent i = new Intent(ConnectActivity.this, GroupsActivity.class); 
      startActivity(i); 
     } else { 

      setContentView(R.layout.connect_screen); 

      // Add listener to the button 
      Button buttonConnect = (Button) findViewById(R.id.button_connect); 
      buttonConnect.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        processThread(); 
       } 
      }); 
     } 
    } 


    // PRIVATE METHODS -------------------------------------------------------- 

    private void processThread() { 

     progressDialog = ProgressDialog.show(ConnectActivity.this, "", 
       "Loading. Please wait...", true, false); 

     tt = new Thread() { 
      public void run() { 

       // Register broadcastReceiver to know when the service finished 
       // its creation 
       ConnectActivity.this.registerReceiver(serviceReceiver, 
         new IntentFilter(Intent.ACTION_VIEW)); 

       // Starts the service 
       startService(new Intent(ConnectActivity.this, 
         LocalService.class)); 

       Log.i(TAG, "Receiver registered..."); 
      } 
     }; 
     tt.start(); 
    } 
} 

Служба выполняет в конце метода OnStart это:

// Send broadcast so activities take it 
Intent i = new Intent(Intent.ACTION_VIEW); 
    sendOrderedBroadcast(i, null); 

Так что OnReceive метод работает, и мы переходим к следующему деятельности

ответ

3

проблема заключается в том, что вы не используете ProgressDialog в потоке пользовательского интерфейса.

Добавить обработчик, который будет обрабатывать сообщения в потоке пользовательского интерфейса.

private static final int UPDATE_STARTED = 0; 
private static final int UPDATE_FINISHED = 1; 

private Handler handler = new Handler(){ 
    @Override public void handleMessage(Message msg) { 
    switch (msg.what) { 
    case UPDATE_STARTED: 
     progressDialog = ProgressDialog.show(ConnectActivity.this, "", 
      "Loading. Please wait...", true, false);     
    break; 
    case UPDATE_FINISHED: 
     if(progressDialog.isShowing()){ 
     progressDialog.dismiss();  
     }    
    break; 
    } 
    } 
}; 


private void processThread() { 
    Message m = new Message(); 
    m.what = UPDATE_STARTED; 
    handler.sendMessage(m); 

    //Your working code 

    m = new Message(); 
    m.what = UPDATE_FINISHED; 
    handler.sendMessage(m); 
} 

удачи!

+0

Благодарим за вопрос. Я пробовал, но это не сработало. Я выяснил проблему в конце. Дело в том, что я делал тяжелую работу в методе onStart (в Сервисе), так что работа блокировала как-то некоторых слушателей системы, и ни BroadCastReceivers, ни Handlers не разбуждались. Когда я переношу код onStart на параллельный поток, он работал как чемпион, как с BroadcastReceivers, так и с Handlers: D – Pedriyoo

Смежные вопросы