0

ユーザーが他のユーザーに「紹介」を送信できるAndroidアプリに取り組んでいます。起動時に、次のメソッドを実行します。このメソッドは、リモート データベースにクエリを実行し、新しい紹介をチェックします。

@Override
protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();
    String username = extras.getString(WeShouldActivity.ACCOUNT_NAME);

    HttpClient httpclient = new DefaultHttpClient();

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("user_email", username));

    String paramString = URLEncodedUtils.format(nameValuePairs, "utf-8");

    HttpGet httpget = new HttpGet("http://23.23.237.174/check-referrals?"+paramString);

    JSONObject resp = new JSONObject();
    JSONArray data = new JSONArray();

    try {

        HttpResponse response = httpclient.execute(httpget);

        InputStream is = response.getEntity().getContent();


        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        int i=0;
        while(i != -1){
            i = is.read();
            baos.write(i);
        }



        byte[] buf = baos.toByteArray(); 
        //is.read(buf);

        Log.v("REFERRAL RESPONSE", new String(buf));

        resp = new JSONObject(new String(buf));

        data = resp.getJSONArray("referrals"); 


        Log.v("GETREFERRALSSERVICE", "Checking for new referrals");


    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        Log.v("GETREFERRALSSERVICE", e.getMessage());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Log.v("GETREFERRALSSERVICE", e.getMessage());
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.v("GET REFFERAL SERVICE", "JSON EXCEPTION "+e.getMessage());
    }

    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager nm = (NotificationManager) getSystemService(ns);

    int icon = R.drawable.restaurant;
    String tickerText = "New referrals!";
    long when = System.currentTimeMillis();
    Notification notification = new Notification(icon, tickerText, when);

    Context context = getApplicationContext();
    CharSequence contentTitle = "New referrals!";

    Log.v("REFERRAL DATA", data.toString());

    if(data.length() >0){
        CharSequence contentText = "You have "+data.length()+" new referrals awaiting your approval.";
        Intent notificationIntent = new Intent(this, ApproveReferral.class);
        notificationIntent.putExtra("we.should.communication.data", data.toString());
        //Log.v("AFTER EXTRAS INSERT", notificationIntent.getStringExtra("data"));
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
        notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL;
        nm.notify(ActivityKey.NEW_REFERRAL.ordinal(), notification);
    } 
}

そのため、リモート データベースに紹介がある場合は、通知がポップアップ表示されます。通知をクリックすると、以下に示す ApproveReferral アクティビティがトリガーされます。

@Override
public void onCreate(Bundle savedInstanceState) {

    final Context c = this.getApplicationContext(); //I don't know if this is the right way to do this!
    super.onCreate(savedInstanceState);
    setContentView(R.layout.approve_referral);
    ListView lv = (ListView) findViewById(R.id.referralList);
    final List<Referral> list = new ArrayList<Referral>();
    Intent intent = this.getIntent();
    Bundle bundle = intent.getExtras();
    String dataAsString = bundle.getString("we.should.communication.data");
    Log.v("DATA EXTRA", dataAsString);
    JSONArray data = new JSONArray();
    //get referral items from extras
    try {
        data = new JSONArray(dataAsString);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    for(int i=0; i<data.length(); i++){
        try {
            JSONObject o = data.getJSONObject(i);
            Log.v("REFFERAL OBJECT DATA", o.toString());

            JSONObject d = new JSONObject(o.getString("data"));

            list.add(new Referral(o.getString("item_name"), o.getString("referred_by"), false, d));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.v("REFERRAL OBJECT DATA", e.getMessage());
        }

    }
    Log.v("REFERRAL LIST", list.toString());
    mAdapter = new ReferralAdapter(this, list);
    lv.setAdapter(mAdapter);

    mSave = (Button) findViewById(R.id.save);
    mSave.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            List<Referral> approvedList = mAdapter.getApprovedList();

            //TODO: send approved/rejected to remote db and delete

            Referrals refs = Referrals.getReferralCategory(c);

            for(Referral r: approvedList){
                ReferralItem ref = refs.newItem(r.getData());

                try{
                    ref.save();
                } catch(Exception e) {
                    Toast.makeText(c, e.getMessage(), Toast.LENGTH_SHORT).show();
                    return;
                }


            }

            deleteRefs(list);

            finish();
        }

    });
}

私は自分自身に紹介を送信するか (許可されているため、そうではありません)、または他の誰かが私に紹介を送信するという問題を抱えていました。新しい紹介」ですが、紹介の承認ビューを開くと、2 つしか表示されません。

これは、ApproveReferral のエクストラに入れた「データ」文字列が、出力される文字列ではないという事実にまでたどり着きました。

例えば

Log.v("REFERRAL DATA", data.toString());
notificationIntent.putExtra("we.should.communication.data", data.toString());

および data.toString() は次のようになります。

05-28 12:53:10.874: V/REFERRAL DATA(13610): [{"data":"{\"website:0:1\":\"http:\\\/\\\/m.imdb.com\\\/title\\\/tt0848228\",\"name:0:0\":\"The Avengers\",\"comment:1:5\":\"2012\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":2,\\\"color\\\":\\\"Red\\\",\\\"tag\\\":\\\"again\\\"}]\"}","item_name":"The Avengers","referred_by":"troyschuring@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.edgewaterhotel.com\\\/edgewater_dining.aspx\",\"name:0:0\":\"Six Seven\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 269-4575\",\"rating:3:4\":\"\",\"tags:1:6\":\"[]\",\"address:1:3\":\"{\\\"long\\\":-122.352644,\\\"address\\\":\\\"2411 Alaskan Way, Seattle, WA, United States\\\",\\\"lat\\\":47.612579}\"}","item_name":"Six Seven","referred_by":"cc.emeraldeyes@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.paseoseattle.com\\\/\",\"name:0:0\":\"Paseo\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 545-7440\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":1,\\\"color\\\":\\\"Purple\\\",\\\"tag\\\":\\\"Colin\\\"}]\",\"address:1:3\":\"{\\\"long\\\":-122.3501502,\\\"address\\\":\\\"4225 Fremont Avenue North, Seattle, WA, United States\\\",\\\"lat\\\":47.6586176}\"}","item_name":"Paseo","referred_by":"cc.emeraldeyes@gmail.com"}]

ほら、3項目あります!

そして、approveReferral の開始時に:

05-28 12:53:13.877: V/DATA EXTRA(13610): [{"data":"{\"website:0:1\":\"http:\\\/\\\/m.imdb.com\\\/title\\\/tt0848228\",\"name:0:0\":\"The Avengers\",\"comment:1:5\":\"2012\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":2,\\\"color\\\":\\\"Red\\\",\\\"tag\\\":\\\"again\\\"}]\"}","item_name":"The Avengers","referred_by":"troyschuring@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.edgewaterhotel.com\\\/edgewater_dining.aspx\",\"name:0:0\":\"Six Seven\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 269-4575\",\"rating:3:4\":\"\",\"tags:1:6\":\"[]\",\"address:1:3\":\"{\\\"long\\\":-122.352644,\\\"address\\\":\\\"2411 Alaskan Way, Seattle, WA, United States\\\",\\\"lat\\\":47.612579}\"}","item_name":"Six Seven","referred_by":"cc.emeraldeyes@gmail.com"}]

現在は2つしかありません。

私が考えることができる唯一のことは、approveReferralが何らかの理由で「キャッシング」であることです(私はアンドロイドに慣れておらず、用語がどのように適用されるかわからないため、引用符で囲みます)そのエクストラであり、使用していません更新されたエクストラ。

これを修正するにはどうすればよいですか?

4

1 に答える 1

0

結局のところ、Androidの複製は私のインテントエクストラをキャッシュし続けます。新しいエクストラを保持する保留中のインテントを宣言するにはどうすればよいですか?、とりわけ。

FLAG_UPDATE_CURRENTを追加すると、問題が解決したようです。

于 2012-05-28T21:38:17.317 に答える