如何在其他类的片段内传递数据doInBackground?

时间:2016-04-09 16:07:54

标签: android google-maps android-asynctask

我有一个类来做一个工作正常的AsyncTask,我可以将数据传递给我的mainActivity。现在我遇到的问题是,我不知道如何在MainActivity的其他地方处理这些数据。我想在代码段(标记)中使用此数据将一些信息放入标记中:

AsyncTask类。

public class DistanceBetweenLocations extends AsyncTask<String, Void, String> {

    URL url;

    @Override
    protected String doInBackground(String... params) {
        HttpURLConnection urlConnection = null;
        StringBuilder result = null;
        String duration = "";
        String distance = "";

        try {
             url = new URL(params[0]);
        }catch (MalformedURLException m){

        }

        try {
            urlConnection = (HttpURLConnection) url.openConnection();
        }catch (IOException e){

        }

        try {
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            result = new StringBuilder();
            String line;
            while((line = reader.readLine()) != null) {
                result.append(line);
            }
        }catch (IOException e){

        } finally {
            urlConnection.disconnect();
        }

        try {

            JSONObject jsonObject = new JSONObject(result.toString());
            JSONArray jsonArray = jsonObject.getJSONArray("rows");
            JSONObject object_rows = jsonArray.getJSONObject(0);
            JSONArray jsonArrayElements = object_rows.getJSONArray("elements");
            JSONObject  object_elements = jsonArrayElements.getJSONObject(0);
            JSONObject object_duration = object_elements.getJSONObject("duration");
            JSONObject object_distance = object_elements.getJSONObject("distance");

            duration = object_duration.getString("text");
            distance = object_distance.getString("text");

            return distance + ", " + duration + " Driving";

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

        return null;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        MainActivity mp = new MainActivity();
        mp.getDataFromAsyncTask(s);
    }
}

这是我在MainActivity中获取片段数据的方法:

 public void getDataFromAsyncTask(String result) {
        getDistanceAndTime = result + km;
    }

我想在这里使用这些数据:

mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude()))
                                .title(name.getName())
                                .snippet(getDistanceAndTime)//here is where I want to put the data that I get in getDataFromAsyncTask
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

这是我尝试的,但我没有数据:

我有一个全局变量,我在我的getDataFromAsyncTask中使用并放入我的代码段,但他首先获取了inicialization的数据:

String getDistanceAndTime

public void getDataFromAsyncTask(String result) {
            getDistanceAndTime = result + km;
        }

  mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude()))
                                    .title(name.getName())
                                    .snippet(getDistanceAndTime)//here is where I want to put the data that I get in getDataFromAsyncTask
                                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

3 个答案:

答案 0 :(得分:1)

这是我在处理这些场景时会做的事情 - 类之间的沟通;使代码尽可能分离。考虑到这一点,活动开始发挥作用!

  • 使用变量创建一个Event类(Plain Old Java Object POJO)(boolean isCompleted以及更新标记所需的值 - 从AsyncTask获取)。构造函数应该使用值在onPostExecute中设置这些变量。这是您通知活动活动的地方。 EventBus.getDefault().post(new EventClassName(true, value));
  • 使用事件库 - 我最喜欢的是EventBus,在AsyncTask的onPostExecute()方法中,您可以将新值传回活动。
  • 活动必须通过EventBus.getDefault().register(this)
  • 注册(订阅)您在步骤1中创建的活动
  • 您还必须取消注册活动或片段的onDestroy。
  • 现在,最后,您需要为您的活动添加一个带有以下签名的方法 - 此方法将捕获从onPostExecute()发布的事件,并且必须如下所示:public void onEvent(EventClassName event)
  • 在此方法中,您应该调用更新Marker的方法,或者根据需要直接更新它!

要使用EventBus库,只需将其添加到build.gradle dependecies

即可
 compile 'org.greenrobot:eventbus:3.0.0'

你应该好好去!祝你好运,编码愉快。

答案 1 :(得分:0)

在onPostExecute方法中,您自己实例化活动,它只是没有用处,系统实例化活动。如果从MainActivity调用AsyncTask,则将引用传递给它,然后使用该引用调用您的方法。

答案 2 :(得分:0)

这里对你的代码存在误解:

MainActivity mp = new MainActivity();
mp.getDataFromAsyncTask(s);

在Android中,您不创建活动对象实例。当您开始活动时,Android会为您创建它们。

要将字符串或其他数据传递给活动,您可以将该数据放入启动活动的intent中,然后在活动的onCreate()期间将该数据从intent中提取出来以使用它。这是Android中最基本的做法之一,the documentation for that is here