0
我有rpc 2.0服務器,我提出請求並獲得響應。在onPreExecute方法中,我定義了ProgressDialog並調用show方法,並在onPostExecute方法中調用了關閉ProgressBar,但我的請求進度和進度對話框在最後一個進程中顯示時,我的活動可能會有人幫我解決這個問題嗎?ProgressDialog後期顯示,活動滯後使用AsyncTask
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);
}
}
}
性反應的類的實例:
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();
}
}
}
怎麼我用它在我的活動:
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);
}
當您調用.get()時,主線程(UI)會凍結,因此在doInBackground()完成之前不會執行圖形計算。試試看,你會看到。不能保證在.get()之前調用onPreExecute(),即使它被稱爲ProgressBar也不會更新。 – x11
那麼,我如何才能實現服務器請求的過程進度? Runnuble接口對於這種情況是很好的選擇? – Govtart
AsyncTask就好,你需要通知onPostExecute你的Activity從服務器收到響應。例如,將你的活動作爲參數'pinauthRequest.send(yourActivity);'並將AsyncTask作爲參數。 – x11