Android 将对象数据从服务放到活动

Android 将对象数据从服务放到活动,android,broadcastreceiver,android-intentservice,Android,Broadcastreceiver,Android Intentservice,我试图使用Intent服务解析来自mysql的数据,并将其放到主活动中 MyTestService.java public class MyTestService extends IntentService { public MyTestService() { super("MyTestService"); // TODO Auto-generated constructor stub } @Override protected void onHandleIntent(Int

我试图使用Intent服务解析来自mysql的数据,并将其放到主活动中

MyTestService.java

public class MyTestService extends IntentService {

public MyTestService() {
    super("MyTestService");
    // TODO Auto-generated constructor stub
}

@Override
protected void onHandleIntent(Intent intent) {
    Parameter result = downloadData();
    Log.d("msg", result.toString());
    Intent in = new Intent();
    in.setAction(Receiver.ACTION_RESP);
    in.addCategory(Intent.CATEGORY_DEFAULT);
    in.putExtra("123", (Parcelable) result);
    sendBroadcast(in);

}

private Parameter downloadData() {
    Parameter parameter = new Parameter();
    String data = (new LandSlideHttpClient()).getDeviceData();
    try {
        parameter = JSONLandslideParser.getParameter(data);
    } catch (Exception e) {

    }
    return parameter;
}
}

MainActivity.java

public class MainActivity extends ActionBarActivity {
private Receiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    IntentFilter filter = new IntentFilter(Receiver.ACTION_RESP);
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    receiver = new Receiver();
    registerReceiver(receiver, filter);
    Intent intent = new Intent(this, MyTestService.class);
    startService(intent);
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    unregisterReceiver(receiver);
}
 public class Receiver extends BroadcastReceiver {

    public static final String ACTION_RESP = "abcdef";

    @Override
    public void onReceive(Context context, Intent intent) {
        Parameter result = (Parameter) intent.getParcelableExtra("123");
        TextView textView = (TextView) findViewById(R.id.textview);
        textView.setText(result.id.getID());
    }

}
}
当我运行代码时,Logcat是

04-22 04:14:32.512: E/AndroidRuntime(4472): java.lang.RuntimeException: Error receiving broadcast Intent { act=abcdef cat=[android.intent.category.DEFAULT] flg=0x10 (has extras) } in com.example.testservice.MainActivity$Receiver@416fd1c0

>04-22 04:14:32.512: E/AndroidRuntime(4472):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:773
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Handler.handleCallback(Handler.java:730)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Looper.loop(Looper.java:137)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.app.ActivityThread.main(ActivityThread.java:5103)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at java.lang.reflect.Method.invokeNative(Native Method)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at java.lang.reflect.Method.invoke(Method.java:525)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at dalvik.system.NativeStart.main(Native Method)
04-22 04:14:32.512: E/AndroidRuntime(4472): Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.example.testservice.Parameter
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Parcel.readParcelableCreator(Parcel.java:2114)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Parcel.readParcelable(Parcel.java:2055)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Parcel.readValue(Parcel.java:1971)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Parcel.readMapInternal(Parcel.java:2255)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Bundle.unparcel(Bundle.java:223)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.os.Bundle.getParcelable(Bundle.java:1170)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.content.Intent.getParcelableExtra(Intent.java:4501)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at com.example.testservice.MainActivity$Receiver.onReceive(MainActivity.java:59)
04-22 04:14:32.512: E/AndroidRuntime(4472):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:763)
04-22 04:14:32.512: E/AndroidRuntime(4472):     ... 9 more
Parameter.java

public class Parameter implements Parcelable{

    public class currentData {
        private float temp;
        private float acc;
        private float moisture;
        private float battery;
        private String date;
        private String time;

        public float getTemp() {
            return temp;
        }

        public void setTemp(float temp) {
            this.temp = temp;
        }

        public float getAcc() {
            return acc;
        }

        public void setAcc(float acc) {
            this.acc = acc;
        }

        public float getMoisture() {
            return moisture;
        }

        public void setMoisture(float moisture) {
            this.moisture = moisture;
        }

        public float getBattery() {
            return battery;
        }

        public void setBattery(float battery) {
            this.battery = battery;
        }

        public String getTime() {
            return time;
        }

        public void setTime(String time) {
            this.time = time;
        }

        public String getDate() {
            return date;
        }

        public void setDate(String date) {
            this.date = date;
        }

    }

    public class ID {
        private String ID;

        public String getID() {
            return ID;
        }

        public void setID(String iD) {
            ID = iD;
        }
    }

    public ID id = new ID();
    public currentData currentData = new currentData();

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub

    }
 }

使用CREATOR修改了参数类。查看此项了解更多详细信息。请记住,在写入包裹和读取包裹时,写入和读取参数的顺序应相同,否则将无法工作

public class Parameter implements Parcelable{

    public class currentData {
        private float temp;
        private float acc;
        private float moisture;
        private float battery;
        private String date;
        private String time;

        public float getTemp() {
        return temp;
        }

        public void setTemp(float temp) {
        this.temp = temp;
        }

        public float getAcc() {
        return acc;
        }

        public void setAcc(float acc) {
        this.acc = acc;
        }

        public float getMoisture() {
        return moisture;
        }

        public void setMoisture(float moisture) {
        this.moisture = moisture;
        }

        public float getBattery() {
        return battery;
        }

        public void setBattery(float battery) {
        this.battery = battery;
        }

        public String getTime() {
        return time;
        }

        public void setTime(String time) {
        this.time = time;
        }

        public String getDate() {
        return date;
        }

        public void setDate(String date) {
        this.date = date;
        }

    }

    public class ID {
        private String ID;

        public String getID() {
        return ID;
        }

        public void setID(String iD) {
        ID = iD;
        }
    }

    public ID id = new ID();
    public currentData currentData = new currentData();

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // Implement your code to write data to parcel


    }

    //This is required for creating parcealable 
    public static final Parcelable.Creator<Parameter> CREATOR = new Creator<Parameter>() {

        @Override
        public Parameter[] newArray(int size) {
            return new Parameter[size];
        }

        @Override
        public Parameter createFromParcel(Parcel source) {
            return new Parameter(source);
        }
    };

    public Parameter (Parcel source){
        // Implement your code to read data from parcel
    }
}
public类参数实现可包裹{
公共类数据{
私人浮动温度;
私人浮动acc;
私人浮子水分;
私人浮充电池;
私有字符串日期;
私有字符串时间;
公共浮点getTemp(){
返回温度;
}
公共无效设置(浮动温度){
this.temp=temp;
}
公共浮点数getAcc(){
返回acc;
}
公共无效setAcc(浮动acc){
this.acc=acc;
}
公众浮标{
回潮;
}
公共湿度(浮子湿度){
这个.湿度=湿度;
}
公共浮子电池(){
回流电池;
}
公共电池(浮充电池){
这个。电池=电池;
}
公共字符串getTime(){
返回时间;
}
公共无效设置时间(字符串时间){
这个时间=时间;
}
公共字符串getDate(){
返回日期;
}
公共无效设置日期(字符串日期){
this.date=日期;
}
}
公共类ID{
私有字符串ID;
公共字符串getID(){
返回ID;
}
公共无效集合iD(字符串iD){
ID=ID;
}
}
公共ID=新ID();
public currentData currentData=新currentData();
@凌驾
公共int描述内容(){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
//实现将数据写入地块的代码
}
//这是创建可打包文件所必需的
公共静态最终包裹。创建者=新创建者(){
@凌驾
公共参数[]newArray(整数大小){
返回新参数[大小];
}
@凌驾
公共参数createFromParcel(地块源){
返回新参数(源);
}
};
公共参数(地块源){
//实现从地块读取数据的代码
}
}

请显示完整崩溃日志添加完整日志,请告诉我问题出在哪里
04:14:32.512:E/AndroidRuntime(4472):原因:android.os.BadParcelableException:Parcelable协议需要一个名为Creator的Parcelable.Creator对象,该对象位于class com.example.testservice.Parameter
请显示
参数的类
您的
参数
类似乎没有正确实现
Parcelable
共享您的参数对象类感谢您的帮助@Rajen,您知道通过意图将对象参数放入活动的其他方法吗?请检查此项。您可以在活动中创建ResultReceiver并传递给intentservice。