2016-06-26 8 views
0

私は、サービスによって呼び出される非アクティビティクラスのReadConfig関数を持っています。この関数は、IntentServiceを使用してファイルからデータを読み取ります。ブロードキャスト受信者からデータを取得する単一の機能

機能

Intent configData = new Intent(actionID); 
    configData.putStringArrayListExtra("CONFIGDATA",FileOperations.readFile(fileName)); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(configData); 

意向サービス

//Start of globalVariables 
public static boolean received; 
public static String actionID = "ACTION_ID"; 
public static ArrayList<String> configData; 
public static BroadcastReceiver configDataReceiver; 
//End of globalVariables 

public static List<String> ReadConfig(Context context, String configFileName) 
{ 
    configDataReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context arg0, Intent intent) 
     { 
      if(intent.getAction().equals(actionID)) 
      { 
       configData = intent.getStringArrayListExtra("CONFIGDATA"); 
       received = true; 
      } 
     } 
    }; 
    LocalBroadcastManager.getInstance(context) 
      .registerReceiver(configDataReceiver,new IntentFilter(actionID)); 
    Intent workRequest = new Intent(context,IOConfigurations.class); 
    workRequest.putExtra("OPERATION","READ"); 
    workRequest.putExtra("FILENAME",configFileName); 
    //Calling intentservice 
    context.startService(workRequest); 

    //Wait for broadcast receiver to get data and assign to global variables 
    while (!received) 
    { 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    LocalBroadcastManager.getInstance(context).unregisterReceiver(configDataReceiver); 
    return configData; 
} 

非アクティビティ・クラスに意図サービスが呼び出されると、データを放送するが、受信機は、しかしから任意のデータを受信しないばかりれますブロードキャストマネージャーとwhileループは永遠に続く。

答えて

0

whileループは、その後の作業が行われているので、whileループが行われた後、私は、リスナーの登録を解除しています完了したら、私のコメント

public static List<String> ReadConfig(Context context, String configFileName) 
{ 
    configDataReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context arg0, Intent intent) 
     { 
      if(intent.getAction().equals(actionID)) 
      { 
       configData = intent.getStringArrayListExtra("CONFIGDATA"); 
       received = true; 
      } 
     } 
    }; 
    LocalBroadcastManager.getInstance(context) 
      .registerReceiver(configDataReceiver,new IntentFilter(actionID)); 
    Intent workRequest = new Intent(context,IOConfigurations.class); 
    workRequest.putExtra("OPERATION","READ"); 
    workRequest.putExtra("FILENAME",configFileName); 
    //Calling intentservice 
    context.startService(workRequest); 

    //Wait for broadcast receiver to get data and assign to global variables 
    while (!received) 
    { 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    // Why here your unregistering the broacast listener, 
// Your registering and unregistering in same call, unregiter when your work is done   

LocalBroadcastManager.getInstance(context).unregisterReceiver(configDataReceiver); 
    return configData; 
} 
+0

をご確認ください。 – Balakrishnan

+0

ACTION_IDの値が次のように変更されました=> com.example.data_fetch_action – Sush

+0

あなたは正しいですが、私はintent.getAction()メソッドを使用しました。これは、 "ACTION_ID"ではなくnullを返すIntenetサービスでした。アクティビティから呼び出されたときにも同じことが機能していない場合、アクティビティは永遠にフリーズします。 – Balakrishnan

関連する問題