2016-05-05 19 views
0

私のプログラムは、いくつかの食物のカロリーを計算することです。これはCSコースの練習です。私はAndroid OSの初心者で、受信プロセスを完了できない、またはアクティビティに表示できない理由がわかりません。2つのカスタムアプリケーションの間にブロードキャストが受信されない

ここに関連コードを書きます。私はsqliteデータベース上のいくつかの項目があり、私はLog.dメソッドでデータベース上の私の項目をチェックすることができ、彼らは大丈夫です。

App1の:

マニフェスト:

<receiver android:name="ItemBroadcastReceiver" 
      android:exported="true"> 
    <intent-filter> 
     <action android:name="com.example.furkan.datagenerator" /> 

    </intent-filter> 
</receiver> 

Received.class

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.received); 

    ItemBroadcastReceiver br = new ItemBroadcastReceiver(); 
    Cursor cursor = (Cursor) br.receivedItem; 
    ReceivedItemsAdapter adapter = new ReceivedItemsAdapter(this, cursor); 
    ListView listView = getListView(); 
    listView.setAdapter(adapter); 
} 

アダプタ:

public class ReceivedItemsAdapter extends CursorAdapter { 
public ReceivedItemsAdapter(Context context, Cursor c) { 
    super(context, c); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View retView = inflater.inflate(R.layout.received, parent, false); 

    return retView; 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    //ImageView icon = (ImageView) view.findViewById(R.id.icon); 
    TextView name = (TextView) view.findViewById(R.id.name); 
    TextView cal = (TextView) view.findViewById(R.id.amountCal); 
    TextView unit = (TextView) view.findViewById(R.id.unit); 
    unit.setText(" cal"); 
    name.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1)))); 
    cal.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2)))); 

}} 

放送受信機:

public class ItemBroadcastReceiver extends BroadcastReceiver { 
Item receivedItem; 
@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 

    receivedItem = new Item(bundle.getString("name"), 
           Integer.parseInt(bundle.getString("calories")), 
           bundle.getString("category"), 
           null); 
}} 

App2の:

MainActivity:

public class MainActivity extends AppCompatActivity { 
final int DELAY = 60000; 
ReceivedItem item; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ReceivedItemsDatabaseHelper dbHelper = new  ReceivedItemsDatabaseHelper(this); 


    item = new ReceivedItem(dbHelper.fetchReceivedItem().getString(
      dbHelper.fetchReceivedItem().getColumnIndex(
        dbHelper.fetchReceivedItem().getColumnName(1))), 
      Integer.parseInt(dbHelper.fetchReceivedItem().getString(
        dbHelper.fetchReceivedItem().getColumnIndex(
          dbHelper.fetchReceivedItem().getColumnName(2)))), 
      dbHelper.fetchReceivedItem().getString(
        dbHelper.fetchReceivedItem().getColumnIndex(
          dbHelper.fetchReceivedItem().getColumnName(3))), null); 

    Thread thread = new Thread() { 
     public void run() { 
      synchronized (this) { 
       try { 
        Log.d("Response ", item.getName()+", "+item.getCategory()+", "+item.getCalories()); 
        Intent intent = new Intent(); 
        intent.setAction("com.example.furkan.datagenerator"); 
        intent.putExtra("name", item.getName()); 
        intent.putExtra("calories", item.getCalories()); 
        intent.putExtra("category", item.getCategory()); 
        sendBroadcast(intent); 
        sleep(DELAY); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     } 
    }; 
    thread.start(); 
}} 

マニフェスト:

<?xml version="1.0" encoding="utf-8"?> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

答えて

0
IntentFilter filter = new IntentFilter(); 
filter.addAction("com.example.furkan.datagenerator"); 

ItemBroadcastReceiver br = new ItemBroadcastReceiver(); 
registerReceiver(br, filter); 
0

もう一度BroadcastReceiversを読む必要があります。

ItemBroadcastReceiver br = new ItemBroadcastReceiver(); 
Cursor cursor = (Cursor) br.receivedItem; 
ReceivedItemsAdapter adapter = new ReceivedItemsAdapter(this, cursor); 
ListView listView = getListView(); 
listView.setAdapter(adapter); 

これは、受信機の新しいインスタンスを作成し、cursorreceivedItemを割り当てます。しかしreceivedItemnullであり、ブロードキャストにはbrを登録しないので、決してnullではありません。また、ItemCursorにキャストできるかどうかわかりません。

ここに投稿したコードと使用したタイトルを考慮すると、BroadcastReceiverを使用すると良いことではないかもしれません。インテントを介してReceivedにデータを渡すか、永続ストレージから直接データをロードするようにしてください。

最後にあなたのthreadは意味をなさない。

+0

ランダムなアイテムを60秒ごとに他のアプリにブロードキャストしたいだけです – user139518

+0

それを 'Cursor'にキャストする際の問題はまだ有効です。変更については、 'BroadcastReceiver'内から' Activity'を通知する必要があります。グローバル状態は保存されません。 – tynn

関連する問題