Android 如何从AsyncTasks doInBackground()检索数据?
我会尽可能地简单 我的控制层中有一个方法,它使用一个类Android 如何从AsyncTasks doInBackground()检索数据?,android,android-asynctask,Android,Android Asynctask,我会尽可能地简单 我的控制层中有一个方法,它使用一个类CallServiceTask,该类扩展了AsyncTask。调用newCallServiceTask()时。执行(参数) 如何检索从doInBackground返回的数据?我发现的所有教程都使用直接从其活动扩展异步任务的类 我的问题比那要复杂一点。 我只想获取doInBackground返回的Object[]并将其设置为我的RestClient类的私有数据成员 CallServiceTask如下所示: private class C
CallServiceTask
,该类扩展了AsyncTask
。调用newCallServiceTask()时。执行(参数)
如何检索从
doInBackground
返回的数据?我发现的所有教程都使用直接从其活动扩展异步任务的类
我的问题比那要复杂一点。
我只想获取doInBackground
返回的Object[]
并将其设置为我的RestClient
类的私有数据成员
CallServiceTask
如下所示:
private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{
protected Object[] doInBackground(Object... params)
{
HttpUriRequest req = (HttpUriRequest) params[0];
String url = (String) params[1];
return executeRequest(req, url);
}
}
私有类CallServiceTask扩展了AsyncTask
{
受保护对象[]doInBackground(对象…参数)
{
HttpUriRequest req=(HttpUriRequest)参数[0];
字符串url=(字符串)参数[1];
返回executeRequest(请求,url);
}
}
我的RestClient类如下所示:
public class RestClient
{
private ArrayList <NameValuePair> params;
private ArrayList <NameValuePair> headers;
private JSONObject jsonData;
private Object[] rtnData;
private String url;
private boolean connError;
public int getResponseCode() {
return responseCode;
}
/**
*
* @return the result of whether the login was successful by looking at the response parameter of the JSON object.
*/
public Boolean DidLoginSucceed()
{
// Will Crash on socket error
return ((JSONObject) rtnData[0]).optBoolean("response");
}
public String GetToken()
{
return jsonData.optString("token");
}
public RestClient(String url)
{
this.url = url;
params = new ArrayList<NameValuePair>();
headers = new ArrayList<NameValuePair>();
rtnData = new Object[]{ new JSONObject() , Boolean.TRUE };
}
public void AddParam(String name, String value)
{
params.add(new BasicNameValuePair(name, value));
}
public void AddHeader(String name, String value)
{
headers.add(new BasicNameValuePair(name, value));
}
/**
* This method will execute, call the service and instantiate the JSON Object through executeRequest().
*
* @param method an enum defining which method you wish to execute.
* @throws Exception
*/
public void ExecuteCall(RequestMethod method) throws Exception
{
Object[] parameters = new Object[]{ new HttpGet() , new String("") };
switch(method) {
case GET:
{
//add parameters
String combinedParams = "";
if(!params.isEmpty()){
combinedParams += "?";
for(NameValuePair p : params)
{
String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue());
if(combinedParams.length() > 1)
{
combinedParams += "&" + paramString;
}
else
{
combinedParams += paramString;
}
}
}
HttpGet request = new HttpGet(url + combinedParams);
//add headers
for(NameValuePair h : headers)
{
request.addHeader(h.getName(), h.getValue());
}
parameters[0] = request;
parameters[1] = url;
new CallServiceTask().execute(parameters);
jsonData = ((JSONObject) rtnData[0]).optJSONObject("data");
connError = (Boolean) rtnData[1];
break;
}
case POST:
{
HttpPost request = new HttpPost(url);
//add headers
for(NameValuePair h : headers)
{
request.addHeader(h.getName(), h.getValue());
}
if(!params.isEmpty()){
request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
}
new CallServiceTask().execute(request, url);
break;
}
}
}
private Object[] executeRequest(HttpUriRequest request, String url)
{
HttpClient client = new DefaultHttpClient();
client = getNewHttpClient();
HttpResponse httpResponse;
try {
httpResponse = client.execute(request);
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
String response = convertStreamToString(instream);
try {
rtnData[0] = new JSONObject(response);
rtnData[1] = false;
} catch (JSONException e1) {
rtnData[1] = true;
e1.printStackTrace();
}
// Closing the input stream will trigger connection release
instream.close();
}
} catch (ClientProtocolException e) {
client.getConnectionManager().shutdown();
e.printStackTrace();
} catch (IOException e) {
client.getConnectionManager().shutdown();
e.printStackTrace();
}
return rtnData;
}
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
/**
* Custom HTTP Client accepting all SSL Certified Web Services.
*
* @return n HttpClient object.
*/
public HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
new CallServiceTask(this).execute(request, url);
公共类RestClient
{
私有数组列表参数;
私有数组列表头;
私有JSONObject jsonData;
私有对象[]rtnda;
私有字符串url;
私有布尔错误;
public int getResponseCode(){
返回响应代码;
}
/**
*
*@通过查看JSON对象的响应参数返回登录是否成功的结果。
*/
公共布尔值didloginsucsed()
{
//将在套接字错误时崩溃
返回((JSONObject)rtnData[0]).optBoolean(“响应”);
}
公共字符串GetToken()
{
返回jsonData.optString(“令牌”);
}
公共RestClient(字符串url)
{
this.url=url;
params=新的ArrayList();
headers=newarraylist();
rtnda=new Object[]{new JSONObject(),Boolean.TRUE};
}
public void AddParam(字符串名称、字符串值)
{
添加(新的BasicNameValuePair(名称、值));
}
public void AddHeader(字符串名称、字符串值)
{
添加(新的BasicNameValuePair(名称、值));
}
/**
*此方法将执行、调用服务并通过executeRequest()实例化JSON对象。
*
*@param method定义要执行的方法的枚举。
*@抛出异常
*/
public void ExecuteCall(RequestMethod)引发异常
{
Object[]parameters=new Object[]{new HttpGet(),new String(“”};
开关(方法){
案例获取:
{
//添加参数
字符串组合参数=”;
如果(!params.isEmpty()){
组合参数+=“?”;
用于(名称值对p:params)
{
字符串paramString=p.getName()+“=”+urlcoder.encode(p.getValue());
如果(combinedParams.length()>1)
{
组合参数+=“&”+参数字符串;
}
其他的
{
combinedParams+=paramString;
}
}
}
HttpGet请求=新的HttpGet(url+组合参数);
//添加标题
对于(NameValuePair h:Header)
{
addHeader(h.getName(),h.getValue());
}
参数[0]=请求;
参数[1]=url;
新建CallServiceTask().execute(参数);
jsonData=((JSONObject)rtnData[0])。optJSONObject(“数据”);
connError=(布尔)rtnda[1];
打破
}
个案职位:
{
HttpPost请求=新的HttpPost(url);
//添加标题
对于(NameValuePair h:Header)
{
addHeader(h.getName(),h.getValue());
}
如果(!params.isEmpty()){
setEntity(新的UrlEncodedFormEntity(params,HTTP.UTF_8));
}
新建CallServiceTask().execute(请求,url);
打破
}
}
}
私有对象[]executeRequest(HttpUriRequest请求,字符串url)
{
HttpClient=new DefaultHttpClient();
client=getNewHttpClient();
HttpResponse HttpResponse;
试一试{
httpResponse=client.execute(请求);
HttpEntity entity=httpResponse.getEntity();
如果(实体!=null){
InputStream instream=entity.getContent();
字符串响应=convertStreamToString(流内);
试一试{
rtnda[0]=新的JSONObject(响应);
rtnda[1]=假;
}捕获(JSONException e1){
rtnda[1]=真;
e1.printStackTrace();
}
//关闭输入流将触发连接释放
流内关闭();
}
}捕获(客户端协议例外e){
client.getConnectionManager().shutdown();
e、 printStackTrace();
}捕获(IOE异常){
client.getConnectionManager().shutdown();
e、 printStackTrace();
}
返回数据;
}
私有静态字符串convertStreamToString(InputStream为){
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is));
StringBuilder sb=新的StringBuilder();
字符串行=null;
试一试{
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
is.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
使某人返回字符串();
}
/**
*接受所有SSL认证的Web服务的自定义HTTP客户端。
*
*@return n HttpClient对象。
*/
公共HttpClient getNewHttpClient(){
试一试{
KeyStore trustStore=KeyStore.getInstance(KeyStore.getDefaultType());
load(null,null);
SSLSocketFactory sf=新的MySSLocketFactory(信任商店);
sf.setHostnameVerifi
new CallServiceTask(this).execute(request, url);
private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{
RestClient caller;
CallServiceTask(RestClient caller) {
this.caller = caller;
}
protected Object[] doInBackground(Object... params)
{
HttpUriRequest req = (HttpUriRequest) params[0];
String url = (String) params[1];
return executeRequest(req, url);
}
protected onPostExecute(Object result) {
caller.onBackgroundTaskCompleted(result);
}
}
public interface ClientIF {
public void onResponseReceived(Object result);
}
public abstract class CallServiceTask extends AsyncTask<Object, Void, Object[]>
implements ClientIF
{
Activity activity;
CallServiceTask(Activity activity) {
this.activity = activity;
}
public abstract void onResponseReceived(Object result);
protected Object[] doInBackground(Object... params)
{
HttpUriRequest req = (HttpUriRequest) params[0];
String url = (String) params[1];
return executeRequest(req, url);
}
protected onPostExecute(Object result) {
onResponseReceived(result);
}
}
public class RestClient
{
CallServiceTask service = new CallServiceTask() {
@Override
public void onResponseReceived(Object result) {
// TODO Auto-generated method stub
}
};
}
public class getOperators extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
items = new ArrayList();
dialog = new ProgressDialog(PrepaidOperatorsListActivity.this);
dialog.setMessage("Please Wait...");
dialog.setCancelable(false);
dialog.show();
}
@Override
protected String doInBackground(Void... params) {
BufferedReader reader;
StringBuffer buffer;
String res = null;
try {
URL url = new URL("");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setReadTimeout(40000);
con.setConnectTimeout(40000);
con.setRequestMethod("GET");
con.setRequestProperty("Content-Type", "application/json");
int status = con.getResponseCode();
InputStream inputStream;
if (status == HttpURLConnection.HTTP_OK) {
inputStream = con.getInputStream();
} else {
inputStream = con.getErrorStream();
}
reader = new BufferedReader(new InputStreamReader(inputStream));
buffer = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
res = buffer.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return res;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
System.out.println("JSON RESP:" + s);
String response = s;
try {
JSONObject ecomerrce = new JSONObject(response);
JSONArray jsonArray = ecomerrce.getJSONArray("prepaid_operators");
for (int j = 0; j < jsonArray.length(); j++) {
JSONObject jsonObject = jsonArray.getJSONObject(j);
PrepaidOperatorsPojo prepaidOperatorsPojo = new PrepaidOperatorsPojo(jsonObject.getString("operator_name"), jsonObject.getString("operator_code"), jsonObject.getString("operator_display_comission"), jsonObject.getString("operator_calculate_comission"));
items.add(prepaidOperatorsPojo);
}
if (items.size() > 0) {
dialog.dismiss();
prepaidOperatorListAdapter = new PrepaidOperatorListAdapter(PrepaidOperatorsListActivity.this, items);
rvPrepaidOperatorList.setAdapter(prepaidOperatorListAdapter);
} else {
dialog.dismiss();
Toast.makeText(PrepaidOperatorsListActivity.this, "No Data to display", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
private void walletStatements() {
JSONObject post_search = new JSONObject();
try {
post_search.put("username", getUserName);
} catch (JSONException e) {
e.printStackTrace();
}
if (post_search.length() > 0) {
try {
new Getwalletstatements().execute(String.valueOf(post_search));
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Getwalletstatements extends AsyncTask<String, String, String> {
String JsonResponse = null;
ProgressDialog dialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(ReportsActivity.this);
dialog.setMessage("Please Wait...");
dialog.setCancelable(false);
dialog.show();
}
@Override
protected String doInBackground(String... params) {
String JsonDATA = params[0];
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
URL url = null;
try {
url = new URL(Constant.url+"GetReports_v9.php");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoOutput(true); // is output buffer writter
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("Accept", "application/json");//set headers and method
Writer writer = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream(), "UTF-8"));
writer.write(JsonDATA);// json data
writer.close();
InputStream inputStream = urlConnection.getInputStream();//input stream
StringBuffer buffer = new StringBuffer();
if (inputStream == null) { // Nothing to do.
return null;
}
reader = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
while ((inputLine = reader.readLine()) != null)
buffer.append(inputLine + "\n");
if (buffer.length() == 0) { // Stream was empty. No point in parsing.
return null;
}
JsonResponse = buffer.toString();
return JsonResponse;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
}
}
}
return null;
}
@Override
protected void onPostExecute(String s) {
if (JsonResponse != null) {
try {
NetworkIN.iv= Constant.iv;
NetworkIN.change=Constant.key;
NetworkIN mCrypt=new NetworkIN();
String decrypted = new String( mCrypt.decrypt(JsonResponse.trim()) );
if(decrypted!=null){
JSONObject ordersHistory = new JSONObject(decrypted);
msg = ordersHistory.getString("msg");
JSONArray jsonArray = ordersHistory.getJSONArray("PPDetails");
ordersCount = jsonArray.length();
//for (int j = 0; j < jsonArray.length(); j++)
for (int j = jsonArray.length() - 1; j >= 0; j--)
{
JSONObject jsonObject = jsonArray.getJSONObject(j);
String message,total_in,inType ;
total_in =jsonObject.getString("total_in");
inType =jsonObject.getString("in_type");
message="Congratulations your wallet is credited by Rs."+total_in+" because of "+inType;
ReportsPojo reportsPojo = new ReportsPojo(jsonObject.getString("reg_id"),
jsonObject.getString("username"),
jsonObject.getString("transfer_from"),
jsonObject.getString("transfer_to"),
jsonObject.getString("total_in"),
jsonObject.getString("tds"),
jsonObject.getString("in_amount") ,
jsonObject.getString("out_amount"),
jsonObject.getString("in_type"),
jsonObject.getString("created_on"),
message);
reportsItems.add(reportsPojo);
}
}else{
}
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
if (msg.equals("Success")) {
reportsAdapter = new ReportsAdapter(ReportsActivity.this, reportsItems);
reportsListview.setAdapter(reportsAdapter);
} else {
Toast.makeText(ReportsActivity.this, "Sorry "+msg, Toast.LENGTH_LONG).show();
}
dialog.dismiss();
} else {
dialog.dismiss();
}
}
public class MyAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
//showProgressDialog
dialog = new ProgressDialog(this);
dialog.setMessage("Loading........");
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.show();
}
@Override
protected String doInBackground(String... strings) {
HttpURLConnection httpURLConnection;
BufferedReader reader;
int responseCode ;
try {
URL url = new URL(YOUR_URL);
URLConnection urlConnection = url.openConnection();
httpURLConnection = (HttpURLConnection) urlConnection;
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setDoOutput(true);
responseCode = httpURLConnection.getResponseCode();
InputStream inputStream = httpURLConnection.getInputStream();
if (inputStream != null) {
if (responseCode == 200) {
reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder buffer = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
return buffer.toString();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
progressDialog.dismiss();
// Fetch Your Data Add Your Code Here
}
}