来自android的Web服务调用使用DataDroid库不将数据返回到活动

时间:2013-12-20 01:45:20

标签: java android web-services rest datadroid

下面我列出了我的活动代码,调用了Web服务,以及我创建的json解析类来解析Web服务结果。我正在尝试将用户对象传递回活动以确定它们能够/不能做什么,但是,我没有超过“执行后”日志语句。 onRequestFinished永远不会被调用,这是我期望它最终结束的地方。任何帮助都会非常感激,因为DataDroid似乎没有太多活动......

LoginActivity.java

package com.motosho.ui;

import com.foxykeep.datadroid.requestmanager.Request;
import com.foxykeep.datadroid.requestmanager.RequestManager.RequestListener;
import com.motosho.R;
import com.motosho.data.model.User;
import com.motosho.data.requestmanager.RequestFactory;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.content.Intent;

public final class LoginActivity extends DataDroidActivity implements RequestListener,
    OnClickListener {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        bindViews();
    }

    protected void onResume() {
        super.onResume();
        for(int i=0; i < mRequestList.size(); i++) {
            Request request = mRequestList.get(i);

            if(mRequestManager.isRequestInProgress(request)) {
                mRequestManager.addRequestListener(this, request);
                setProgressBarIndeterminateVisibility(true);
            } else {
                mRequestManager.callListenerWithCachedData(this, request);
                i--;
                mRequestList.remove(request);
            }
        }
    }

    protected void onPause() {
        super.onPause();
        if(!mRequestList.isEmpty()) {
            mRequestManager.removeRequestListener(this);
        }
    }

    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }

    private void bindViews() {
        ((Button) findViewById(R.id.sign_in_button)).setOnClickListener(this);
    }

    private void callLoginWS(String username, String pin, String eventId) {
        Log.i("LOGIN", "in callLoginWS - username=" + username + ", pin=" + pin + ", eventid=" + eventId);
        setProgressBarIndeterminateVisibility(true);
        Request request = RequestFactory.getLoginRequest(username, pin, eventId);
        mRequestManager.execute(request, this);
        Log.i("LOGIN", "after execute");
        mRequestList.add(request);
    }

    public void onClick(View view) {
        switch(view.getId()) {
        case R.id.sign_in_button:
            EditText emailText = (EditText) findViewById(R.id.email);
            EditText pinText = (EditText) findViewById(R.id.pin);
            Log.i("LOGIN","set email and pin text");
            callLoginWS(emailText.getText().toString(), pinText.getText().toString(),"9");
            break;
        }       
    }

    @Override
    public void onRequestFinished(Request request, Bundle resultData) {
        Log.i("LOGIN", "inside onRequestFinished");
        if(mRequestList.contains(request)) {
            setProgressBarIndeterminateVisibility(false);
            Log.i("LOGIN", "request found");
            mRequestList.remove(request);

            Toast toast = Toast.makeText(this, "request finished", Toast.LENGTH_SHORT);
            toast.show();
            User user = resultData.getParcelable("user");
            if(user != null) {
                startActivity(new Intent(this, MainActivity.class).putExtras(resultData));
            }
        }
    }

    @Override
    public void onRequestConnectionError(Request request, int statusCode) {
        Log.i("LOGIN", "onRequestConnectionError");
        if(mRequestList.contains(request)) {
            setProgressBarIndeterminateVisibility(false);
            //show error
            Toast toast = Toast.makeText(this, "connection error", Toast.LENGTH_SHORT);
            toast.show();
            mRequestList.remove(request);
        }
    }

    @Override
    public void onRequestDataError(Request request) {
        Log.i("LOGIN", "onRequestDataError");
        if(mRequestList.contains(request)) {
            setProgressBarIndeterminateVisibility(false);
            mRequestList.remove(request);

            //show error
            Toast toast = Toast.makeText(this, "data error", Toast.LENGTH_SHORT);
            toast.show();
        }       
    }

    @Override
    public void onRequestCustomError(Request request, Bundle resultData) {
        // Never called     
    }

    public void connectionErrorDialogRetry(Request request) {
        Log.i("LOGIN", "connectionErrorDialogRetry");
        String username = request.getString("username");
        String pin = request.getString("pin");
        String eventId = request.getString("eventid");
        callLoginWS(username,pin,eventId);
    }
}

LoginOperation.java

package com.motosho.data.operation;

import java.util.HashMap;

import android.content.Context;
import android.os.Bundle;

import com.foxykeep.datadroid.exception.ConnectionException;
import com.foxykeep.datadroid.exception.CustomRequestException;
import com.foxykeep.datadroid.exception.DataException;
import com.foxykeep.datadroid.network.NetworkConnection;
import com.foxykeep.datadroid.network.NetworkConnection.ConnectionResult;
import com.foxykeep.datadroid.network.NetworkConnection.Method;
import com.foxykeep.datadroid.requestmanager.Request;
import com.foxykeep.datadroid.service.RequestService.Operation;
import com.motosho.config.WSConfig;
import com.motosho.data.factory.LoginJsonFactory;

public final class LoginOperation implements Operation {

    @Override
    public Bundle execute(Context context, Request request)
        throws ConnectionException, DataException, CustomRequestException {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("username", request.getString("username"));
        params.put("pin", request.getString("pin"));
        params.put("eventid", request.getString("eventid"));

        NetworkConnection networkConnection = new NetworkConnection(context, WSConfig.WS_LOGIN_URL);
        networkConnection.setMethod(Method.POST);
        networkConnection.setParameters(params);
        ConnectionResult result = networkConnection.execute();

        return LoginJsonFactory.parseResult(result.body);
    }
}

LoginJsonFactory.java

package com.motosho.data.factory;

import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.util.Log;

import com.foxykeep.datadroid.exception.DataException;
import com.motosho.config.JSONTag;
import com.motosho.data.model.User;

public final class LoginJsonFactory {
    private static final String TAG = LoginJsonFactory.class.getName();

    private LoginJsonFactory() { }

    @SuppressWarnings("null")
    public static Bundle parseResult(String wsResponse) throws DataException {
        User user = new User();

        try {
            JSONObject parser = new JSONObject(wsResponse);
            JSONObject jsonRoot = parser.getJSONObject(JSONTag.USER_ELEM);
            user.firstName = jsonRoot.getString(JSONTag.USER_ELEM_FIRST_NAME);
            user.lastName = jsonRoot.getString(JSONTag.USER_ELEM_LAST_NAME);
            user.phoneNumber = jsonRoot.getString(JSONTag.USER_ELEM_PHONE_NUMBER);
            user.role = jsonRoot.getString(JSONTag.USER_ELEM_ROLE);
            JSONArray jsonPositionsArray = jsonRoot.getJSONArray(JSONTag.USER_ELEM_LIST_POSITIONS);
            int size = jsonPositionsArray.length();
            List<String> tempPositionsArray = null;

            for (int i=0; i < size; i++) {
                tempPositionsArray.add(jsonPositionsArray.getString(i));
            }
            user.positions = tempPositionsArray;

            JSONArray jsonCapabilitiesArray = jsonRoot.getJSONArray(JSONTag.USER_ELEM_LIST_CAPABILITIES);
            size = jsonCapabilitiesArray.length();
            List<String> tempCapabilitiesArray = null;

            for(int i=0; i < size; i++) {
                tempCapabilitiesArray.add(jsonCapabilitiesArray.getString(i));
            }
            user.capabilities = tempCapabilitiesArray;
        } catch (JSONException e) {
            Log.e(TAG, "JSONException", e);
            throw new DataException(e);
        }

        Bundle bundle = new Bundle();
        bundle.putParcelable("user", user);     
        return bundle;
    }
}

0 个答案:

没有答案