Java 方法中的Android匿名异步任务返回值
现在在我的应用程序中,我尝试从url进行http解析,但在此之前,我并没有携带任何线程 我有这样的课程和方法:Java 方法中的Android匿名异步任务返回值,java,android,android-asynctask,Java,Android,Android Asynctask,现在在我的应用程序中,我尝试从url进行http解析,但在此之前,我并没有携带任何线程 我有这样的课程和方法: public class TwitterOAuthHelper { public String httpQueryToApi(String url) { HttpGet get = new HttpGet(url); HttpParams params = new BasicHttpParams(); HttpProtocolParams
public class TwitterOAuthHelper {
public String httpQueryToApi(String url) {
HttpGet get = new HttpGet(url);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setUseExpectContinue(params, false);
get.setParams(params);
String response = null;
try {
SharedPreferences settings = context.getSharedPreferences("my_app", 0);
String userKey = settings.getString("user_key", "");
String userSecret = settings.getString("user_secret", "");
consumer.setTokenWithSecret(userKey, userSecret);
consumer.sign(get);
DefaultHttpClient client = new DefaultHttpClient();
response = client.execute(get, new BasicResponseHandler());
} catch (Exception e) {
displayToast("Failed to get data.");
}
return response;
}
}
现在我尝试将此逻辑转移到asyncTask中:
String result;
public String httpQueryToApi(String url) {
new AsyncTask<String,Void,String>(){
@Override
protected String doInBackground(String... params) {
HttpGet get = new HttpGet(String.valueOf(params));
HttpParams param = new BasicHttpParams();
HttpProtocolParams.setUseExpectContinue(param, false);
get.setParams(param);
String response = null;
try {
SharedPreferences settings = context.getSharedPreferences("my_app", 0);
String userKey = settings.getString("user_key", "");
String userSecret = settings.getString("user_secret", "");
consumer.setTokenWithSecret(userKey, userSecret);
consumer.sign(get);
DefaultHttpClient client = new DefaultHttpClient();
response = client.execute(get, new BasicResponseHandler());
} catch (Exception e) {
displayToast("Failed to get data.");
}
result = response;
return response;
}
}.execute(url);
return result;
}
字符串结果;
公共字符串httpQueryToApi(字符串url){
新建异步任务(){
@凌驾
受保护的字符串doInBackground(字符串…参数){
HttpGet=newhttpget(String.valueOf(params));
HttpParams param=新的BasicHttpParams();
HttpProtocolParams.setUseExpectContinue(参数,false);
get.setParams(param);
字符串响应=null;
试一试{
SharedReferences设置=context.getSharedReferences(“我的应用程序”,0);
String userKey=settings.getString(“user_key”,“user_key”);
String userSecret=settings.getString(“user_secret”,”);
consumer.setTokenWithSecret(userKey,userSecret);
消费者签名(get);
DefaultHttpClient=新的DefaultHttpClient();
response=client.execute(get,new BasicResponseHandler());
}捕获(例外e){
displayToast(“获取数据失败”);
}
结果=响应;
返回响应;
}
}.执行(url);
返回结果;
}
但如何将响应结果值返回给方法
这样做的最佳实践是什么?请这样做:
@Override
protected void onPostExecute(String result) {
//result is your returned value from doInBackground
}
如果您想回调另一个方法,它应该是接口
public interface ResultInterface {
public void resultFromHttp(String result);
}
那你的方法呢
public String httpQueryToApi(String url, final ResultInterface ri){
//as bove
@Override
protected void onPostExecute(String result) {
if(ri!=null)
ri.resultFromHttp(result);
}
}
为您的活动实现ResultInterface/Fragment/wahtever正在调用httpQueryToApi
执行以下操作:
@Override
protected void onPostExecute(String result) {
//result is your returned value from doInBackground
}
如果您想回调另一个方法,它应该是接口
public interface ResultInterface {
public void resultFromHttp(String result);
}
那你的方法呢
public String httpQueryToApi(String url, final ResultInterface ri){
//as bove
@Override
protected void onPostExecute(String result) {
if(ri!=null)
ri.resultFromHttp(result);
}
}
为您的活动实现ResultInterface/Fragment/wahtever正在调用httpQueryToApi
执行以下操作:
@Override
protected void onPostExecute(String result) {
//result is your returned value from doInBackground
}
如果您想回调另一个方法,它应该是接口
public interface ResultInterface {
public void resultFromHttp(String result);
}
那你的方法呢
public String httpQueryToApi(String url, final ResultInterface ri){
//as bove
@Override
protected void onPostExecute(String result) {
if(ri!=null)
ri.resultFromHttp(result);
}
}
为您的活动实现ResultInterface/Fragment/wahtever正在调用httpQueryToApi
执行以下操作:
@Override
protected void onPostExecute(String result) {
//result is your returned value from doInBackground
}
如果您想回调另一个方法,它应该是接口
public interface ResultInterface {
public void resultFromHttp(String result);
}
那你的方法呢
public String httpQueryToApi(String url, final ResultInterface ri){
//as bove
@Override
protected void onPostExecute(String result) {
if(ri!=null)
ri.resultFromHttp(result);
}
}
为您的活动实现ResultInterface/Fragment/wahtever正在调用
httpQueryToApi
,因为任务将在另一个线程中执行,所以无法执行
但是,您可以使用回调来获得结果。
请看:。您不能,因为任务将在另一个线程中执行 但是,您可以使用回调来获得结果。
请看:。您不能,因为任务将在另一个线程中执行 但是,您可以使用回调来获得结果。
请看:。您不能,因为任务将在另一个线程中执行 但是,您可以使用回调来获得结果。
请看:。最初,函数返回一个字符串,然后对其进行进一步处理。好的 但是不能像那样使用线程。您不能从函数返回结果,因为它还没有被设置(当然可以,但它将返回null)。正确的做法是
public void httpQueryToApi(String url) {
new AsyncTask<String,Void,String>(){
@Override
protected String doInBackground(String... params) {
HttpGet get = new HttpGet(String.valueOf(params));
HttpParams param = new BasicHttpParams();
HttpProtocolParams.setUseExpectContinue(param, false);
get.setParams(param);
String response = null;
try {
SharedPreferences settings = context.getSharedPreferences("my_app", 0);
String userKey = settings.getString("user_key", "");
String userSecret = settings.getString("user_secret", "");
consumer.setTokenWithSecret(userKey, userSecret);
consumer.sign(get);
DefaultHttpClient client = new DefaultHttpClient();
response = client.execute(get, new BasicResponseHandler());
} catch (Exception e) {
displayToast("Failed to get data.");
}
return response;
}
@Override
protected void onPostExecute(String s) {
//here s is the response string, do what ever you want
super.onPostExecute(s);
}
}.execute(url);
}
public void httpQueryToApi(字符串url){
新建异步任务(){
@凌驾
受保护的字符串doInBackground(字符串…参数){
HttpGet=newhttpget(String.valueOf(params));
HttpParams param=新的BasicHttpParams();
HttpProtocolParams.setUseExpectContinue(参数,false);
get.setParams(param);
字符串响应=null;
试一试{
SharedReferences设置=context.getSharedReferences(“我的应用程序”,0);
String userKey=settings.getString(“user_key”,“user_key”);
String userSecret=settings.getString(“user_secret”,”);
consumer.setTokenWithSecret(userKey,userSecret);
消费者签名(get);
DefaultHttpClient=新的DefaultHttpClient();
response=client.execute(get,new BasicResponseHandler());
}捕获(例外e){
displayToast(“获取数据失败”);
}
返回响应;
}
@凌驾
受保护的void onPostExecute(字符串s){
//这是响应字符串,做任何你想做的事
super.onPostExecute(s);
}
}.执行(url);
}
您必须将进一步的处理逻辑转换为onPostExecute,没有其他方法:)
如果您想更深入地了解一下最初,您的函数返回一个字符串,然后对其进行进一步处理。好的 但是不能像那样使用线程。您不能从函数返回结果,因为它还没有被设置(当然可以,但它将返回null)。正确的做法是
public void httpQueryToApi(String url) {
new AsyncTask<String,Void,String>(){
@Override
protected String doInBackground(String... params) {
HttpGet get = new HttpGet(String.valueOf(params));
HttpParams param = new BasicHttpParams();
HttpProtocolParams.setUseExpectContinue(param, false);
get.setParams(param);
String response = null;
try {
SharedPreferences settings = context.getSharedPreferences("my_app", 0);
String userKey = settings.getString("user_key", "");
String userSecret = settings.getString("user_secret", "");
consumer.setTokenWithSecret(userKey, userSecret);
consumer.sign(get);
DefaultHttpClient client = new DefaultHttpClient();
response = client.execute(get, new BasicResponseHandler());
} catch (Exception e) {
displayToast("Failed to get data.");
}
return response;
}
@Override
protected void onPostExecute(String s) {
//here s is the response string, do what ever you want
super.onPostExecute(s);
}
}.execute(url);
}
public void httpQueryToApi(字符串url){
新建异步任务(){
@凌驾
受保护的字符串doInBackground(字符串…参数){
HttpGet=newhttpget(String.valueOf(params));
HttpParams param=新的BasicHttpParams();
HttpProtocolParams.setUseExpectContinue(参数,false);
get.setParams(param);
字符串响应=null;
试一试{
SharedReferences设置=context.getSharedReferences(“我的应用程序”,0);
String userKey=settings.getString(“user_key”,“user_key”);
String userSecret=settings.getString(“user_secret”,”);
consumer.setTokenWithSecret(userKey,userSecret);
消费者签名(get);
DefaultHttpClient=新的DefaultHttpClient();
response=client.execute(get,new BasicResponseHandler());
}捕获(例外e){
displayToast(“获取数据失败”);
}
返回响应;
}