2010-12-01 15 views
2

サービスの準備中に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メソッドの最後で実行される...それは次のアクティビティを開始する前に、右...私は本当にそれが何であるかを見つけることはありませんProgressDialogを示すことですこの:

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

のでonReceiveメソッドが実行され、私たちは、問題は、あなたがUIスレッドでProgressDialogを実行していないということです

答えて

3

次のアクティビティに進みます。

UIスレッドのメッセージを処理するハンドラを追加します。

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もハンドラも目を覚まされていないということです。 onStartコードを並列スレッドに移行すると、BroadcastReceiversとHandlersの両方でチャンピオンのように機能しました。D – Pedriyoo

関連する問題