0

我是 JAVA 新手,但在 C/C++ 等其他语言方面有经验。我正在研究 android,现在创建一个访问 JSON Web 服务的应用程序。

我的课程代码如下:

public class AsycTaskCall {

private final JSONObject jsonObject;
private final Context context;

public static String results;

public AsycTaskCall(Context ctx, JSONObject jobject)
{
    this.jsonObject = jobject;
    this.context = ctx;
}

public String call()
{
    new WebServiceTask().execute("");
    Log.d("RESULTS_CALL", "Results : " + results); //results is null here
    return this.results;
}

private class WebServiceTask extends AsyncTask<String, Void, String> {
    protected String doInBackground(String... args) {
        JsonWebService jsonWebService = new JsonWebService(context);
        return jsonWebService.callWebService(jsonObject);
    }
    protected void onPostExecute(String result) {
        try
        {
            JSONObject jo = new JSONObject(result);
            String status = jo.getString("success");

            results = result;

            if (status == "true")
            {
               Log.d("RESULTS", " Result : " + result + " : Results " + results); // results is fine here also
            }
            else
            {
                Log.d("RESULT_STATUS", "False");
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
    }
  }

我创建了这个类,因为我的应用程序将在很多地方调用 Web 服务,所以我想创建一个类,并将 JSONObject 传递给它,然后这个类调用 Web 服务异步。

一切正常,我得到了所需的结果,但现在我想将结果返回给调用活动。为此,我创建了一个

public static String results;

属性并将从 web 服务返回的字符串保存在此变量中。该变量在子类 WebServiceTask 中有数据,但在同一个变量中,主类中的数据为空,或者当我在主类调用函数中返回时,它为空。

请告诉我如何解决这个问题。

谢谢

4

3 回答 3

2

WebServiceTask计划在后台执行,因此可能无法立即获得结果。但是您尝试results在排队执行之后立即获取下一行中的 。这在大多数情况下是行不通的。

AsyncTask 文档

注意:此函数根据平台版本将任务安排在单个后台线程或线程池的队列中。首次引入时,AsyncTask 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。

如果您想等待完成并在排队任务后直接接收值,您可以调用get()执行的方法。AsyncTask但这将使后台任务的想法变得毫无用处,并且可能会阻塞您的 UI 线程,具体取决于您调用call()from 的位置。

于 2013-07-14T14:00:19.683 回答
1

这是一种不寻常的风格

new WebServiceTask().execute("");

没有保留参考,例如

WebServiceTask webServiceTask = new WebServiceTask();
webServiceTask.execute("");

所以我想知道它在垃圾收集中存活了多久,考虑到任务本身需要一些时间来执行。

也许尝试一个

WebServiceTask webServiceTask;

在您的声明部分开头,然后使用

webServiceTask = new WebServiceTask();
webServiceTask.execute("");

一旦你有很多调用,像这样使用全局变量和静态变量可能会让你有些头疼。

于 2013-07-14T13:52:53.130 回答
0

您必须将此静态变量用作 ClassName.results 或者您可以仅将结果设为公共而不是静态的,并通过 ((ClassName)ctx).results = "value" 等上下文分配值

于 2013-07-14T13:55:30.347 回答