Java 方法中的Android匿名异步任务返回值

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

现在在我的应用程序中,我尝试从url进行http解析,但在此之前,我并没有携带任何线程

我有这样的课程和方法:

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(“获取数据失败”);
}
返回响应;
}