I have rpc 2.0 server to which I make request and get response. In onPreExecute method I define ProgressDialog and call show method and in onPostExecute method I call dismiss ProgressBar, but my activity lag when I make request and progressDialog show in last second of process, can anybody help me with this issue?
RequestClass:
public class HomeCommRequest {
public static final int ID_GET_MOBILE_AUTH_TOKEN = 1;
public static final int ID_PIN_LOGIN = 2;
public static final int ID_GET_ALL_DEVICES_LIST = 3;
public static final int ID_GET_DEVICES_LIST = 4;
public static final int ID_GET_CU_INFO = 5;
public static final int ID_GET_DEVICE_INFO = 6;
public static final int ID_GET_USER_INFO = 7;
public static final int ID_CHANGE_DEVICE_ALARM_STATE = 8;
public static final int ID_CHANGE_CU_ALARM_STATE = 9;
public static final String METHOD_GET_USER_INFO = "getUserInfo";
public static final String METHOD_GET_CU_INFO = "getCentralUnitInfo";
public static final String METHOD_GET_ALL_DEVICES_LIST = "getAllDevicesList";
public static final String METHOD_GET_MOBILE_AUTH_TOKEN = "getMobileAuthToken";
public static final String METHOD_PIN_LOGIN = "pinLogin";
public static final String METHOD_GET_DEVICES_LIST = "getDevicesList";
public static final String METHOD_CHANGE_DEVICE_ALARM_STATE = "changeAlarmState";
public static final String METHOD_CHANGE_CU_ALARM_STATE = "changeCUAlarmState";
public static final String METHOD_GET_DEVICE_INFO = "getDeviceInfo";
private Map<String,Object> params;
private Context context;
private int id;
private String cookie;
private String method;
private ProgressDialog dialog;
private String serverURL = "MY SERVER URL"
public HomeCommRequest(int id, String method, Map<String,Object> params, String cookie, Context context)
{
this.id = id;
this.method = method;
this.params = params;
this.cookie = cookie;
this.context = context;
}
public <T> T send()
{
T resp = null;
doRequest request = new doRequest();
request.execute();
try {
resp = (T) request.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resp;
}
private String inputStreamToString(InputStream is) {
String s = "";
String line = "";
// Wrap a BufferedReader around the InputStream
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
// Read response until the end
try {
while ((line = rd.readLine()) != null) { s += line; }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Return full string
return s;
}
private JSONObject sendRequest(String method, Map<String,Object> params, int id, String cookieToRequest) throws Exception
{
String result = null;
//Packing inputed parameters into second massive for rpc request
List paramsToSend = new ArrayList();
paramsToSend.add(params);
// Creating a new JSON-RPC 2.0 request
JSONRPC2Request reqOut = new JSONRPC2Request(method, paramsToSend, id);
HttpClient client = new DefaultHttpClient();
//Creating new HttpPost entry for POST request
HttpPost post = new HttpPost(serverURL);
if(cookieToRequest != null)
post.setHeader("Cookie", "sid=" + cookieToRequest);
HttpResponse response = null;
try {
//Push JSON string in request
post.setEntity(new StringEntity(reqOut.toJSONString()));
//Get response from server
response = client.execute(post);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
//Get string from respond entry
HttpEntity entity = response.getEntity();
InputStream instream = null;
if (entity != null) {
try {
instream = entity.getContent();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Convert respond to string
result = inputStreamToString(instream);
Log.i("HomeCommRequest", "Message from server = " + result);
}
return new JSONObject(result);
}
public class doRequest extends AsyncTask<Void, Void, Response>
{
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(context, ProgressDialog.THEME_HOLO_LIGHT);
dialog.setMessage("Please, wait...");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected Response doInBackground(Void... backgroundParams) {
Response response = null;
try {
JSONObject jsonResponseObj = sendRequest(method, params, id, cookie);
switch(id)
{
case ID_PIN_LOGIN: response = new PinLoginResponse(jsonResponseObj);
default: Log.e("Request", "Error. doBackground. Invalid id value in switch = " + id);
}
publishProgress();
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(Response result) {
if(dialog.isShowing())
dialog.dismiss();
if(result.hasError())
{
AlertDialog.Builder ad = new AlertDialog.Builder(context, AlertDialog.THEME_HOLO_LIGHT);
ad.setTitle("Error!");
ad.setMessage(result.getErrorString());
ad.setPositiveButton("Dismiss", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {}
});
AlertDialog add = ad.create();
add.show();
}
super.onPostExecute(result);
}
}
}
Example of responce class:
public class PinLoginResponse extends Response {
private String sessionKey;
private JSONObject jsonObj;
private final String TAG = "PinLoginResponse";
public PinLoginResponse(JSONObject jsonObj){
this.jsonObj = jsonObj;
parse(jsonObj);
}
public String getSessionKey() {
return sessionKey;
}
public String getErrorStr()
{
return errorStr;
}
@Override
public void parse(JSONObject jsonObject)
{
errorStr = "No errors";
try {
errorStr = jsonObject.get("errors").toString();
isError = true;
Log.e(TAG, errorStr + " | " + isError);
} catch (JSONException e) {
isError = false;
//e.printStackTrace();
}
try {
sessionKey = jsonObject.get("result").toString();
} catch (JSONException e) {
Log.e(TAG, "No results found");
e.printStackTrace();
}
}
}
And how I use it in my Activity :
void getSessionKey(String pincode)
{
Map<String,Object> params = new HashMap<String,Object>();
params.put("token", token);
params.put("pin", pincode);
HomeCommRequest pinauthRequest = new HomeCommRequest(HomeCommRequest.ID_PIN_LOGIN,
HomeCommRequest.METHOD_PIN_LOGIN,
params,
null,
EnterPincodeActivity.this);
PinLoginResponse getSessionKeyRequest = pinauthRequest.send();
if(!getSessionKeyRequest.hasError())
{
finish();
Intent tabHostActivityIntent = new Intent(EnterPincodeActivity.this, TabsViewActivity.class);
tabHostActivityIntent.putExtra("cookie", getSessionKeyRequest.getSessionKey());
startActivity(tabHostActivityIntent);
}
resp = (T) request.get();
is blocking UI thread. You should handle any response in onPostExecute()
without forcing the main thread to wait for doInBackground()
to finish.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.