2015-05-29 105 views
-3

我已经制作了与AsyncTask一起使用的程序,它在程序执行时打印出JSON数据的列表,但问题在于当我按下按钮时,我希望它执行。如何将AsyncTask的结果导入到我的onClick按钮监听器中?我如何从onClick调用AsyncTask?将AsyncTask添加到onClick监听器

public class MainActivity extends ActionBarActivity implements LocationListener { 


    double[] avstand; 
    JSONArray jArray; 
    LocationManager lm; 
    TextView lt, ln; 
    String provider; 
    Location l; 
    ListView list; 
    StasjonAdapter adapter; 
    ArrayList<Stasjoner> stasjonListe; 
    Button nButton; 
    TextView test; 
    GPSTracker gps; 
    Stasjoner stasjon; 
    double minValue; 
    String geoUri; 
    Button instButton; 
    Button bildeButton; 
    Button kjorTil; 
    Button visListe; 
    File mPhotoFile; 
    Uri mPhotoFileUri; 
    String mDisplayFolder; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     setContentView(R.layout.activity_main); 
     ln=(TextView)findViewById(R.id.visLong); 
     test=(TextView)findViewById(R.id.test); 
     lt=(TextView)findViewById(R.id.visLati); 

     gps = new GPSTracker(MainActivity.this); 

     // check if GPS enabled 
     if(gps.canGetLocation()){ 

      double latitude = gps.getLatitude(); 
      double longitude = gps.getLongitude(); 

      // \n is for new line 
      // Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); 
     }else{ 
      // can't get location 
      // GPS or Network is not enabled 
      // Ask user to enable GPS/network in settings 
      gps.showSettingsAlert(); 
     } 
    //get latitude and longitude of the location 
      double lat= gps.getLatitude(); 
      double lng= gps.getLongitude(); 
      //display on text view 
      ln.setText(""+lng); 
      lt.setText(""+lat); 

     list = (ListView)findViewById(R.id.list); 
     stasjonListe = new ArrayList<Stasjoner>(); 
     nButton = (Button)findViewById(R.id.button1); 
     instButton = (Button)findViewById(R.id.instillinger); 
     bildeButton = (Button)findViewById(R.id.bildeButton); 
     kjorTil= (Button)findViewById(R.id.button); 
     visListe = (Button)findViewById(R.id.visListe); 
     //new StasjonAsyncTask().execute("http://hotell.difi.no/?dataset=porsgrunn/elbilparkering?");  blogas url, jis grazina html puslapi, reikia daryt requesta i api endpoint, kuris grazina json 
     new StasjonAsyncTask().execute("http://hotell.difi.no/api/json/porsgrunn/elbilparkering?"); 

     instButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(MainActivity.this, Instillinger.class); 
       startActivity(intent); 
      } 
     }); 
     nButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int value = (int) getMinValue(avstand); 
       test.setText(stasjonListe.get(value).getLatitude().toString()); 
       test.setText(stasjonListe.get(value).getLongtitude().toString()); 
       String geoURI = "geo:" + stasjonListe.get(value).getLatitude().toString() + ","+ stasjonListe.get(value).getLongtitude().toString() + "?z="; 
       Uri geo = Uri.parse(geoURI); 
       Intent geoMap = new Intent(Intent.ACTION_VIEW,geo); 
       startActivity(geoMap); 
      } 
     }); 

     visListe.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       //StasjonAsyncTask 

      } 
     }); 

     bildeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(MainActivity.this, CustomCameraActivity.class); 
       startActivity(intent); 
      } 
     }); 
     kjorTil.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
         Uri.parse("http://maps.google.com/maps?saddr=" + gps.getLatitude() +"," + gps.getLongitude() + "&daddr=" + Double.parseDouble(stasjon.getLatitude()) +","+Double.parseDouble(stasjon.getLongtitude()))); 
       startActivity(intent); 
      } 
     }); 

    } 

    @Override 
    public void onLocationChanged(Location location) { 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 


    public class StasjonAsyncTask extends AsyncTask<String, Void, Boolean>{ 

     @Override 
     protected Boolean doInBackground(String... urls) { 
      try { 
      HttpClient client = new DefaultHttpClient(); 
      //HttpPost post = new HttpPost(urls[0]); api endpointas nepriima post requestu, pakeiciam i get 
      HttpGet get = new HttpGet(urls[0]); 
      HttpResponse response = client.execute(get); 

      int status = response.getStatusLine().getStatusCode(); 
       if(status == 200) { 
        HttpEntity entity = response.getEntity(); 
        String data = EntityUtils.toString(entity); 

        JSONObject jObj = new JSONObject(data); 
        jArray = jObj.getJSONArray("entries"); 
        avstand = new double[jArray.length()]; 

        for(int i=0;i< jArray.length();i++){ 
         stasjon = new Stasjoner(); 

         JSONObject jRealObject = jArray.getJSONObject(i); 


         stasjon.setId(jRealObject.getString("id")); 
         stasjon.setKapasitet(jRealObject.getString("kapasitet")); 
         stasjon.setPlassering(jRealObject.getString("plassering")); 
         stasjon.setTilgjengelighet(jRealObject.getString("tilgjengelighet")); 
         stasjon.setBeskrivelse(jRealObject.getString("beskrivelse")); 
         stasjon.setNavn(jRealObject.getString("navn")); 
         stasjon.setLongtitude(jRealObject.getString("longitude")); 
         stasjon.setLatitude(jRealObject.getString("latitude")); 
         stasjon.setTilgang(jRealObject.getString("tilgang")); 
         stasjon.setTidsbegrensing(jRealObject.getString("tidsbegrensing")); 

         double dist = distance(Double.parseDouble(stasjon.getLatitude()), Double.parseDouble(stasjon.getLongtitude()), gps.getLatitude(),gps.getLongitude(), 'K'); 
         stasjon.setAvstand(Double.toString(dist)); 

         avstand[i]= dist; 

         stasjonListe.add(stasjon); 
        } 
        return true; 


       } 




      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return false; 
     } 
     protected void onPostExecute(Boolean result) { 
      super.onPostExecute(result); 
      //Arrays.sort(avstand); 

      minValue = getMinValue(avstand); 

      //test.setText(Double.toString(minValue)); 
      if(result== false){ 

      Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 

      } else { 
       StasjonAdapter adapter = new StasjonAdapter(getApplicationContext(),R.layout.rad, stasjonListe); 
       list.setAdapter(adapter); 
      } 
     } 

     private double distance(double lat1, double lon1, double lat2, double lon2, char unit) { 
      double theta = lon1 - lon2; 
      double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); 
      dist = Math.acos(dist); 
      dist = rad2deg(dist); 
      dist = dist * 60 * 1.1515; 
      if (unit == 'K') { 
       dist = dist * 1.609344; 
      } else if (unit == 'N') { 
       dist = dist * 0.8684; 
      } 
      return (dist); 
     } 
     private double deg2rad(double deg) { 
      return (deg * Math.PI/180.0); 
     } 
     private double rad2deg(double rad) { 
      return (rad * 180.0/Math.PI); 
     } 
    } 

    public static double getMinValue(double[] numbers){ 
     double minValue = numbers[0]; 
     int minValueIndex = 0; 
     for(int i=1;i<numbers.length;i++){ 
      if(numbers[i] < minValue){ 
       minValue = numbers[i]; 
       minValueIndex = i; 
      } 
     } 
     return minValueIndex; 
    } 

} 
+2

请不要创建一个单独的帐户来询问上一个问题的更糟糕的版本。相反,回应给出的意见,并帮助我们帮助您 – codeMagic

回答

0

在您的StasjonAsyncTask使活动类变量。 并给它的实例,当你在创建StasjonAsyncTask给活动实例

new StasjonAsyncTask(this).execute("http://hotell.difi.no/api/json/porsgrunn/elbilparkering?"); 
onPostExecute

现在你可以打电话给你活动的任何功能创建StasjonAsyncTask变量

public class StasjonAsyncTask extends AsyncTask<String, Void, Boolean>{ 
private MainActivity myActivity; 

public StasjonAsyncTask(MainActivity myActivity){ 
this.myActivity=myActivity; 
} 
... 

。 另外单独onClick监听器给另一个变量,会比较容易理解。

0
visListe.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      //StasjonAsyncTask 
      new StasjonAsyncTask().execute("http://hotell.difi.no/api/json/porsgrunn/elbilparkering?"); 

     } 
    }); 
+0

如何开始新的活动? –

+0

你可以在方法onPostExecute中调用它,这将在解析完成后得到调用。 –

+0

无法正常工作,您需要放入try catch并发线程! – delive