Android: передать строку JSON в класс службы PostData

Я пытаюсь отправить данные на локальный сервер (WAMP) с помощью API HttpURLConnection. Я реализовал это с помощью IntentService, но не знаю, как передать данные «строка JSON» из MainActivity в класс DataPost.

Эта часть вызывается из метода onLocationChanged во внутреннем классе «MyLocationListener» в MainActivity:

        String jSONString = convertToJSON(pLong, pLat, formatted);

        Intent intent3 = new Intent(MainActivity.this, PostData.class);
        intent3.putExtra("json_data", jSONString);
        PendingIntent pintent3 = PendingIntent.getService(getApplicationContext(), 0, intent3, 0);
        AlarmManager alarm3 = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Calendar cal = Calendar.getInstance();
        // for 30 mint 60*60*1000
        alarm3.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                1000, pintent3);

        startService(intent3);

Класс PostData:

   package com.bustracker;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.IntentService;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Handler;

public class PostData extends IntentService {
    String jSONString;
    Handler handler = new Handler();

    public PostData() {
        super("some");

    }

    public String getjSONString() {
        return jSONString;
    }

    public void setjSONString(String jSONString) {
        this.jSONString = jSONString;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // TODO Auto-generated method stub
        String jSONString = intent.getStringExtra("json_data");
        try {
            // This is the ip address of my laptop wifi because I am running the
            // app in my device and I want to send the data to the localhost
            // server(WAMP).
            URL myUrl = new URL("http://192.168.x.x/webservice");
            HttpURLConnection myConnection = (HttpURLConnection) myUrl
                    .openConnection();
            myConnection.setRequestMethod("POST");
            myConnection.setDoOutput(true);
            myConnection.setUseCaches(false);
            myConnection.setConnectTimeout(10000);
            myConnection.setReadTimeout(10000);
            myConnection.setRequestProperty("Content-Type", "application/json");
            myConnection.connect();
            // create data output stream
            DataOutputStream wr = new DataOutputStream(
                    myConnection.getOutputStream());
            // write to the output stream from the string
            wr.writeBytes(jSONString);
            wr.close();
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

}

person Mr Asker    schedule 23.04.2015    source источник
comment
Почему в сервисе Intent есть асинтаск?   -  person Raghunandan    schedule 23.04.2015
comment
Хорошо, я разберусь с этим позже :) Я думал, что это сработает таким образом.   -  person Mr Asker    schedule 23.04.2015


Ответы (2)


Я не знаю, как передать данные "строка JSON" из MainActivity в класс DataPost.

Используйте Intent.putExtra для передачи jSONString строки в IntentService :

....
// add jSONString to intent using any key
intent3.putExtra("json_data",jSONString);
startService(intent3);

Теперь используйте intent.getStringExtra в onHandleIntent, чтобы получить строку:

@Override
    protected void onHandleIntent(Intent intent) {
        // TODO Auto-generated method stub
     String jSONString = intent.getStringExtra("json_data");
    }

Примечание. Нет необходимости использовать AsyncTask в IntentService, поскольку метод onHandleIntent вызывается в рабочем потоке с запросом на обработку

поэтому используйте метод onHandleIntent для создания http-запроса

person ρяσѕρєя K    schedule 23.04.2015
comment
это намерение здесь другое, чем намерение3? - person Mr Asker; 23.04.2015
comment
Что я не проголосовал? И я тоже не могу этого сделать, так как у меня всего 92 балла ;) - person Mr Asker; 23.04.2015
comment
не могли бы вы взглянуть на мой обновленный код вопроса? Я изменил его на ваш подход, но jSONString становится нулевым в onHandleIntent? - person Mr Asker; 23.04.2015

Вы можете использовать putExtra следующим образом:

Intent i = new Intent(getApplicationContext(), PostData.class);
x="3";
y="A";
i.putExtra(ValueX, x);
i.putExtra(ValueY, y);
startActivity(i);

посмотрите, как клиент будет получать и попробуйте разобрать, это не должно быть сложно.

person Anurag    schedule 23.04.2015