2017-09-16 3 views
0

L'utilisateur doit ajouter un marqueur en appuyant sur la carte. Mon but est d'envoyer le nom, la catégorie, la latitude et la longitude à une base de données SQL.
J'ai suivi cette question: How can you pass multiple primitive parameters to AsyncTask?, mais j'obtiens l'erreur dans cette ligne:AsyncTask exécuter l'erreur

backgroundTask.execute(method,Name,Category,Latitude,Longitude); 

Voir le code:

AddShopActivity.java

public class AddShopActivity extends MainScreen implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener { 

Spinner spinner; 
ArrayAdapter<CharSequence> adapter; 


GoogleMap mGoogleMap; 
GoogleApiClient mGoogleApiClient; 

String Name, Category; 
Double Latitude, Longitude, Latitude_pass, Longitude_pass; 

EditText shop_name = (EditText)findViewById(R.id.Shop_Name); 
Spinner shop_category = (Spinner)findViewById(R.id.spinner); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_add_shop); 
    initMap(); 
    spinner = (Spinner) findViewById(R.id.spinner); 
    adapter = ArrayAdapter.createFromResource(this, R.array.eidoskatastimatos, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setAdapter(adapter); 
} 

private void initMap() { 
    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment); 
    mapFragment.getMapAsync(this); 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mGoogleMap = googleMap; 
    mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 
    mGoogleApiClient.connect(); 
} 

LocationRequest mLocationsRequest; 

@Override 
public void onConnected(Bundle bundle) { 
    mLocationsRequest = LocationRequest.create(); 
    mLocationsRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    mLocationsRequest.setInterval(5000); 
     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 

    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationsRequest, this); 


    mGoogleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
     @Override 
     public void onMapClick(LatLng latLng) { 

      MarkerOptions marker = new MarkerOptions() 
             .position(new LatLng(latLng.latitude, latLng.longitude)) 
             .draggable(true) 
             .title(shop_name.getText().toString()) 
             .snippet(shop_category.getSelectedItem().toString()); 


      CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, 16); 
      mGoogleMap.animateCamera(update); 

      mGoogleMap.clear(); 
      mGoogleMap.addMarker(marker); 

      Latitude_pass = latLng.latitude; 
      Longitude_pass = latLng.longitude; 
     } 
    }); 

} 

public void shopReg(View view) 
{ 
    Name = shop_name.getText().toString(); 
    Category = shop_category.getSelectedItem().toString(); 
    Latitude = Latitude_pass; 
    Longitude = Longitude_pass; 
    String method = "save"; 
    BackgroundTask backgroundTask = new BackgroundTask(this); 
    backgroundTask.execute(method,Name,Category,Latitude,Longitude); //here is the error. It asks me to create the method 'execute' but the guy in a tutorial I am watching doen't do this// 
    finish(); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 

} 

@Override 
public void onLocationChanged(Location location) { 
    if (location == null){ 
     Toast.makeText(this, "Can't get current location", Toast.LENGTH_LONG).show(); 
    } else { 
     LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); 
     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, 16); 
     mGoogleMap.animateCamera(update); 
    } 

} 
} 

BackgroundTask.java

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

String Name, Category; 
Double Latitude, Longitude; 

BackgroundTask(String method, String Name, String Category, Double Latitude, Double Longitude) { 
    this.Name = Name; 
    this.Category = Category; 
    this.Latitude = Latitude; 
    this.Longitude = Longitude; 
} //Trying to pass 2 types of variablew, string and double, because lat and long are double// 

Context ctx; 

BackgroundTask(Context ctx){ 
    this.ctx = ctx; 
} 

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

@Override 
protected String doInBackground(String... params) { 
    String reg_url = "http://10.0.2.2/shop/register.php"; 
    String method = params[0]; 
    if(method.equals("save")) 
    { 
     String Name = params[1]; 
     String Category = params[2]; 
     String Latitude = params[3]; 
     String Longitude = params[4]; 
     try { 
      URL url = new URL(reg_url); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
      httpURLConnection.setRequestMethod("POST"); 
      httpURLConnection.setDoOutput(true); 
      OutputStream OS = httpURLConnection.getOutputStream(); 
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS, "UTF-8")); 
    String data = URLEncoder.encode("Name", "UTF-8") +"="+URLEncoder.encode(Name,"UTF-8")+"&"+ 
      URLEncoder.encode("Category", "UTF-8") +"="+URLEncoder.encode(Category,"UTF-8")+"&"+ 
      URLEncoder.encode("Latitude", "UTF-8") +"="+URLEncoder.encode(Latitude,"UTF-8")+"&"+ 
      URLEncoder.encode("Longitude", "UTF-8") +"="+URLEncoder.encode(Longitude,"UTF-8"); 
      bufferedWriter.write(data); 
      bufferedWriter.flush(); 
      bufferedWriter.close(); 
      OS.close(); 
      InputStream IS = httpURLConnection.getInputStream(); 
      IS.close(); 
      return "Το κατάστημα προστέθηκε!"; 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    return null; 
} 

@Override 
protected void onProgressUpdate(Void... values) { 
    super.onProgressUpdate(values); 
} 

@Override 
protected void onPostExecute(String result) { 
    Toast.makeText(ctx,result,Toast.LENGTH_LONG).show(); 
} 
} 
+1

Veuillez ajouter l'erreur – cutiko

Répondre

3

Vérifié la question liée agai n. Vous manquez la classe "Params".

Les paramètres à execute sont passés dans doInBackground, ce que vous attendez seulement un String[]. Cependant, ce n'est pas exactement où l'erreur est

Votre autre constructeur n'est pas utilisé pour obtenir 2 cordes et 2 lits doubles

Vous avez utilisé que le contexte d'une

new BackgroundTask(this); 

un tutoriel je suis regarder

Tout ce que je peux dire essayer de regarder à nouveau, ou trouver un autre

Je parie qu'il appelle que execute("save"); et a quelque chose comme ça

// add the context to this constructor also 
new BackgroundTask(this, Name, Category, Latitude, Longitude); 

Ou, en regardant le AsyncTask, vous devez utiliser Double.parseDouble et vous devez passer des chaînes

String Name = params[1]; 
    String Category = params[2]; 
    Double Latitude = Double.parseDouble(params[3]); 
    Double Longitude = Double.parseDouble(params[4]); 
+0

voir dans le lien la 3ème réponse (avec les 63 votes). Celui que j'essaie d'appliquer. Vérifiez également le _edited code_, j'ai fait quelques changements comme vous l'avez dit. Aucune erreur soulignée en rouge cette fois-ci, l'application est en cours d'exécution mais ** elle se bloque lorsque j'appuie sur le bouton ** qui appelle le 'shopReg'. –

+0

Je ne peux pas corriger toutes les exceptions d'exécution dans votre code. Lisez les journaux et apprenez comment les réparer. Publiez sur Stackoverflow uniquement si vous êtes vraiment bloqué, mais essayez en fait de comprendre ce que les journaux d'erreurs vous disent –

+0

Et je pense que cette réponse corrige votre message initial. La modification de votre question invalide les deux réponses que vous avez reçues ici.L'action recommandée serait d'accepter une réponse, puis de poster à nouveau avec le code corrigé en tant que [mcve] avec les messages logcat –

0

Ce AsyncTask<String... que les paramètres passent à la méthode execute seront tous de type String. Vous passez, String et double.

En tant que recommandation générale, écrivez vos variables en suivant la convention du chameau. Un accesseur privé d'utilisation.

Votre AsyncTask devrait être


public class BackgroundTask extends AsyncTask { 

private String name, category; 
private double latitude, longitude; 

BackgroundTask(double latitude, double longitude) { 
    this.latitude = latitude; 
    this.longitude = longitude; 
} 
} 

Maintenant, votre constructeur initialize vos doubles et obtenir les chaînes des params comme vous le faites maintenant.