【问题标题】:Pass string from one subclass to another将字符串从一个子类传递到另一个子类
【发布时间】:2015-11-04 23:55:39
【问题描述】:

我正在调用一个 Web 服务以从 json 中获取一个对象,然后我需要将我创建的字符串对象传递给另一个 Web 服务。我在 AsyncTask 中有每个 Web 服务调用。我无法将第一个名为 map 的 jsonObject 传递给另一个子类。不要担心实际调用,我想将字符串“map”传递给第二个 AsyncTask 以便能够在网络调用中使用它。这两个类都是子类。

 public class aisleStoreID extends AsyncTask<String, String, String> {



    @Override
    protected String doInBackground(String... params) {

        String urlExtension = "getpartnerstore?latitude=" + lat + "&longitude=" + lng + "&partner_id=" + "60" + "&vendor_store_nbr=" + id + "";
        final String authToken = Utils.md5(urlExtension);

        String urlString = "http://aisle411.ws/webservices2/getpartnerstore.php?latitude=" + lat + "&longitude=" + lng + "&partner_id=" + 60 + "&vendor_store_nbr=" + id + "&auth=" + authToken;


        InputStream inputStream = null;

        try {
            HttpResponse response = ConnectionHelper.executeHttpGetStoreMap(urlString);
            HttpEntity entity = response.getEntity();
            inputStream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            StringBuilder sb = new StringBuilder();

            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            result = sb.toString();
            if (response != null) {
                result = response.toString();
                JSONObject jsonObject = new JSONObject(String.valueOf(sb));
                JSONArray arr = jsonObject.getJSONArray("stores");
                JSONObject jObj = arr.getJSONObject(0);
                String map = jObj.getString("store_map_url");


                Intent intent = new Intent(this, getStoreMap.class);
                intent.putExtra("retailer_store_id", map);
                startActivity(intent);

            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return e.getMessage();
        }

        return result;
    }

    @Override
    protected void onPostExecute(String result) {

        System.out.println("  What's in it" + result);
    }
}

public class getStoreMap extends AsyncTask<String, String, String> {

    Bundle bundle = getIntent().getExtras();
    String storeMap = bundle.getString("retailer_store_id");

    @Override
    protected String doInBackground(String... params) {
        String urlExtension = "map?latitude=" + lat + "&longitude=" + lng + "&partner_id=" + "60" + "&retailer_store_id=" + map + "";
        final String authToken = Utils.md5(urlExtension);
        String urlString = "http://aisle411.ws/webservices2/map.php?latitude=" + lat + "&longitude=" + lng + "&partner_id=" + 60 + "&retailer_store_id=" + map + "&auth=" + authToken;*/

        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }
}

【问题讨论】:

  • 看起来不错。什么是确切的问题? storeMap 为空?
  • 一开始你为什么要这样做?为什么第一个AsyncTask 不能完成doInBackground 中的所有工作?无论如何,您将这两个 AsyncTasks 紧密耦合,因此它们在其他地方并不是真正可重用的......

标签: java android android-asynctask


【解决方案1】:

尝试将提取storeMap 的代码从extras 移至doInBackground 方法。

【讨论】:

    【解决方案2】:

    您需要在您的 aisleStoreID AsyncTask' onPostExecute() 中执行此操作:

    @Override
        protected void onPostExecute(String result) {
    
            System.out.println("  What's in it" + result);
            String params[]=new String[1];
            params[0]=result;
            new getStoreMap().execute(params);
        }
    

    然后获取getStoreMap AsyncTask的doInBackground中的参数。

    注意:Intent 用于将额外内容从一个组件发送到另一个组件(如活动、服务、广播接收器或内容提供程序),而不是在类或子类之间。

    【讨论】:

    • 仍然对这是如何从 JSONArray 传递地图值以便能够在另一个 Web 服务调用中使用感到困惑。我正在使用的 sdk 要求我从 1 个调用中获取一个值,然后将该值传递给另一个调用以获取图像。我真的很困惑如何将此地图值传递给另一个 Web 服务调用。我可以在同一个 AsyncTask 中调用 2 个 Web 服务调用吗?
    【解决方案3】:

    异步任务并不意味着是一项活动。它意味着在您获取活动数据时在后台工作。区别很重要,我建议您在 android docs

    中阅读它

    我会尝试从 doInBackground 返回地图,然后在 onPostExecute 中调用另一个 AsyncTask,您也可以从其中折叠其中一些变量

    JSONObject jsonObject = new JSONObject(String.valueOf(sb));
    JSONArray arr = jsonObject.getJSONArray("stores");
    JSONObject jObj = arr.getJSONObject(0);
    

    到这里

    JSONObject jsonObject = new JSONObject(String.valueOf(sb)).getJSONArray("stores").getJSONObject(0);
    

    在 onPostExecute 中

    public class aisleStoreID extends AsyncTask<String, String, String> {
        @Override
        String doInBackground(String... params) {
            // ...
            return map;
        }
    
        @Override
        protected void onPostExecute(String result) {
            new getStoreMap().execute(result);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多