从AsyncTask的的onPostExecute方法等活动传递字符串数据 [英] passing string data from onPostExecute method of AsyncTask to other activity

查看:122
本文介绍了从AsyncTask的的onPostExecute方法等活动传递字符串数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题是:在Android编程如何通过类似名称的字符串数据,我们在onPostExecute(获得)地址的AsyncTask的方法,另一个活动将接收这个字符串数据。例如我想通过字符串名称,网址我得到了在onPostExecute()方法,然后通过DoSomething的()函数的字符串,这些数据传送到另一个活动,并启动该活动。请advance.please回复asap.Thanx解释解决方案code。

my question is:In android programming how to pass the string data like name,address that we obtained in onPostExecute() method of AsyncTask to another activity that will receive this string data.for example i want to pass string name, url that i got in onPostExecute() method and then transfer these string data to another activity via dosomething() function and start that activity. please reply asap.Thanx in advance.please explain solution code.

PlaceDetailsActivity

 import org.json.JSONObject;

 import android.app.Activity;
 import android.app.ProgressDialog;
 import android.content.Intent;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.webkit.WebView;

 public class PlaceDetailsActivity extends Activity {
 WebView mWvPlaceDetails;


 ProgressDialog pDialog;



protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_place_details);

    // Getting reference to WebView ( wv_place_details ) of the layout activity_place_details
    mWvPlaceDetails = (WebView) findViewById(R.id.wv_place_details);

    mWvPlaceDetails.getSettings().setUseWideViewPort(false);

    // Getting place reference from the map
    String reference = getIntent().getStringExtra("reference");

    StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/details/json?");
    sb.append("reference="+reference);
    sb.append("&sensor=true");
    sb.append("&key=AIzaSyChVcy-8fLkAq5-ZJCuNomF1lIf-Gda7s8");

    // Creating a new non-ui thread task to download Google place details
    PlacesTask placesTask = new PlacesTask();

    // Invokes the "doInBackground()" method of the class PlaceTask
    placesTask.execute(sb.toString());

};

/** A method to download json data from url */
private String downloadUrl(String strUrl) throws IOException{
    String data = "";
    InputStream iStream = null;
    HttpURLConnection urlConnection = null;
    try{
        URL url = new URL(strUrl);

        // Creating an http connection to communicate with url
        urlConnection = (HttpURLConnection) url.openConnection();

        // Connecting to url
        urlConnection.connect();

        // Reading data from url
        iStream = urlConnection.getInputStream();

        BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

        StringBuffer sb = new StringBuffer();

        String line = "";
        while( ( line = br.readLine()) != null){
            sb.append(line);
        }

        data = sb.toString();
            br.close();

    }catch(Exception e){
        Log.d("Exception while downloading url", e.toString());
    }finally{
        iStream.close();
        urlConnection.disconnect();
    }
    return data;
}
/** A class, to download Google Place Details */
private class PlacesTask extends AsyncTask<String, Integer, String>{

     /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(PlaceDetailsActivity.this);
        pDialog.setMessage("Loading Restaurent Details ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }
    String data = null;

    // Invoked by execute() method of this object
    @Override
    protected String doInBackground(String... url) {
        try{
            data = downloadUrl(url[0]);
        }catch(Exception e){
            Log.d("Background Task",e.toString());
        }
        return data;
    }

    // Executed after the complete execution of doInBackground() method
    @Override
    protected void onPostExecute(String result){
        ParserTask parserTask = new ParserTask();

        // Start parsing the Google place details in JSON format
        // Invokes the "doInBackground()" method of the class ParseTask
        parserTask.execute(result);
    }
}

/** A class to parse the Google Place Details in JSON format */
private class ParserTask extends AsyncTask<String, Integer, HashMap<String,String>>{

    JSONObject jObject;

    // Invoked by execute() method of this object
    @Override
    protected HashMap<String,String> doInBackground(String... jsonData) {

        HashMap<String, String> name = null;
        HashMap<String, String> hPlaceDetails = null;
        PlaceDetailsJSONParser placeDetailsJsonParser = new PlaceDetailsJSONParser();

        try{
            jObject = new JSONObject(jsonData[0]);

            // Start parsing Google place details in JSON format
            hPlaceDetails = placeDetailsJsonParser.parse(jObject);
            name = placeDetailsJsonParser.parse(jObject);


        }catch(Exception e){
            Log.d("Exception",e.toString());
        }
        return hPlaceDetails;
        return name;//(here eclise gives error unrechable code)
    }

    // Executed after the complete execution of doInBackground() method
    @Override
    protected void onPostExecute(HashMap<String,String> hPlaceDetails){



        // dismiss the dialog after getting all products
        pDialog.dismiss();

        String name = hPlaceDetails.get("name");
        String icon = hPlaceDetails.get("icon");
        String vicinity = hPlaceDetails.get("vicinity");
        String lat = hPlaceDetails.get("lat");
        String lng = hPlaceDetails.get("lng");
        String formatted_address = hPlaceDetails.get("formatted_address");
        String formatted_phone = hPlaceDetails.get("formatted_phone");
        String website = hPlaceDetails.get("website");
        String rating = hPlaceDetails.get("rating");
        String international_phone_number = hPlaceDetails.get("international_phone_number");
        String url = hPlaceDetails.get("url");





        String mimeType = "text/html";
        String encoding = "utf-8";

        String data = "<html>"+
                      "<body><img style='float:left' src="+icon+" /><h1><center>"+name+"</center></h1>" +
                      "<br style='clear:both' />" +
                      "<hr />"+
                      //"<p>Vicinity : " + vicinity + "</p>" +
                      //"<p>Location : " + lat + "," + lng + "</p>" +
                      "<p>Address : " + formatted_address + "</p>" +
                      "<p>Phone : " + formatted_phone + "</p>" +
                      "<p>Website : " + website + "</p>" +
                      "<p>Rating : " + rating + "</p>" +
                      "<p>International Phone : " + international_phone_number + "</p>" +
                      "<p>Reviews(Please Open in Web browser) : <a href='" + url + "'>" + url + "</p>" +
                      "</body></html>";

        // Setting the data in WebView
        mWvPlaceDetails.loadDataWithBaseURL("", data, mimeType, encoding, "");
    }
}


public void dosomething(View v)
{




 if (v.getId()==R.id.button2)
 {



 }
 else if (v.getId()==R.id.button3)
 {

 }

}
  }                                                                                                                                                                                                             

PlaceJSONParser类

             public class PlaceJSONParser {

       /** Receives a JSONObject and returns a list */
      public List<HashMap<String,String>> parse(JSONObject jObject){

     JSONArray jPlaces = null;
    try {
        /** Retrieves all the elements in the 'places' array */
        jPlaces = jObject.getJSONArray("results");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    /** Invoking getPlaces with the array of json object
    * where each json object represent a place
    */
    return getPlaces(jPlaces);
}

private List<HashMap<String, String>> getPlaces(JSONArray jPlaces){
    int placesCount = jPlaces.length();
    List<HashMap<String, String>> placesList = new ArrayList<HashMap<String,String>>();
    HashMap<String, String> place = null;

    /** Taking each place, parses and adds to list object */
    for(int i=0; i<placesCount;i++){
        try {
            /** Call getPlace with place JSON object to parse the place */
            place = getPlace((JSONObject)jPlaces.get(i));
            placesList.add(place);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    return placesList;
}

/** Parsing the Place JSON object */
private HashMap<String, String> getPlace(JSONObject jPlace){

    HashMap<String, String> place = new HashMap<String, String>();
    String placeName = "-NA-";
    String vicinity="-NA-";
    String latitude="";
    String longitude="";
    String reference="";

    try {
        // Extracting Place name, if available
        if(!jPlace.isNull("name")){
            placeName = jPlace.getString("name");
        }

        // Extracting Place Vicinity, if available
        if(!jPlace.isNull("vicinity")){
            vicinity = jPlace.getString("vicinity");
        }

        latitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat");
        longitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng");
        reference = jPlace.getString("reference");

        place.put("place_name", placeName);
        place.put("vicinity", vicinity);
        place.put("lat", latitude);
        place.put("lng", longitude);
        place.put("reference", reference);

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

PlaceDetails类

 import java.io.Serializable;

   import com.google.api.client.util.Key;

/** Implement this class from "Serializable"
 * So that you can pass this class Object to another using Intents
   * Otherwise you can't pass to another actitivy
  * */
   public class PlaceDetails implements Serializable {

@Key
public String status;

@Key
public Place result;

@Override
public String toString() {
    if (result!=null) {
        return result.toString();
    }
    return super.toString();
 }
 }

任何帮助AP preciated!

Any help is appreciated !

推荐答案

在我看来有两种选择放在桌子上!

In my opinion two options are available on the table!

1,创建你的的AsyncTask 类作为你的活动类中的内部类,然后您可以访问所有超类的属性。

1.Create your AsyncTask class as an inner class inside your Activity class, and then you can gain access for all super class properties.

public class MyActivity extends Activity {

    int property1;
    void method1() {

    }

    private class MyTask extents AsyncTask<Void, Void, Void> {

        @Override
        protected void onPostExecute(Void param)
            method1(...); // <-- this is method of the enclosing class
        }
    }
}

2.Define您的AsyncTask 类中的公共接口,并调用它的听众在 onPostExecute

2.Define a public interface for your AsyncTask class and call its listener in the onPostExecute

public class MyTask extends AsyncTask<Void, Void, Void> {

    OnTaskFinishedListener mListener;

    @Override
    protected void onPostExecute(Void param)
        if(mListener != null){
            mListenr.onFinished(...); // <-- call your callback
        } 
    }

    public void setOnTaskFinishedListener(OnTaskFinishedListener listener) {
        mListener = listener;
    }

    public interface OnTaskFinishedListener {
        public void onFinished(...);
    }

}

这篇关于从AsyncTask的的onPostExecute方法等活动传递字符串数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆