我有一个类来做一个工作正常的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)));
答案 0 :(得分:1)
这是我在处理这些场景时会做的事情 - 类之间的沟通;使代码尽可能分离。考虑到这一点,活动开始发挥作用!
EventBus.getDefault().post(new EventClassName(true, value));
onPostExecute()
方法中,您可以将新值传回活动。 EventBus.getDefault().register(this)
public void onEvent(EventClassName event)
要使用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。