2017-09-16 13 views
0

マップをタップしてマーカーを追加する必要があります。私の目標は、名前、カテゴリ、緯度、経度をSQLデータベースに送信することです。
私はこの問題を追っ:How can you pass multiple primitive parameters to AsyncTask?が、私は、この行でエラーが発生します。AsyncTask実行エラー

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

コードを参照してください:

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

エラー – cutiko

答えて

3

リンクされた質問を確認しましたn。あなたは "Params"クラスがありません。

executeへのパラメータは、doInBackgroundに渡されます。このパラメータは、と予期されています。エラーがあなたの他のコンストラクタはあなたが唯一の

new BackgroundTask(this); 

私はチュートリアルをコンテキストを使用2つの文字列と2つのダブルス

を取得するために使用されていない

ある場所を正確にしかし、それはありません

を見ていることはすべて私に言えることは、もう一度見てみてください、または別の

を見つけることです

私はそれだけでexecute("save");を呼び出し、この

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

のようなものを持っているか、Asynctaskを見て、あなたがDouble.parseDoubleを使用する必要があり、文字列

にパラメータを渡すこと
String Name = params[1]; 
    String Category = params[2]; 
    Double Latitude = Double.parseDouble(params[3]); 
    Double Longitude = Double.parseDouble(params[4]); 
+0

を追加してください。第3の回答(63票以上)をご覧ください。私はそれを適用しようとします。また、_editedコードを確認してください_、私はあなたが言ったようにいくつかの変更を行いました。今回は赤い下線を引いたエラーはありません。アプリは動作していますが、**ボタンを押すとクラッシュし、**は「shopReg」を呼び出します。 –

+0

コード内のすべてのランタイム例外を修正することはできません。ログを読み、ログを修正する方法を学んでください。あなたが本当に立ち往生している場合にのみ、Stackoverflowに投稿してください。実際にエラーログがあなたに伝えるものを理解しようとします。 –

+0

そして私はこの回答があなたの最初の投稿を修正すると思います。質問を編集すると、ここで受け取った両方の回答が無効になります。推奨されるアクションは、1つの回答を受け入れ、logcatメッセージで[mcve]として修正コードを再度投稿することです –

0

このAsyncTask<String...を渡す必要があります賭けますexecuteメソッドにはすべてString型になります。あなたは渡している、Stringとdouble。

一般的な推奨事項として、ラクダの大会の規則に従い変数を記述します。専用のアクセサリーを使用する。

あなたのAsyncTaskは、今すぐあなたのコンストラクタはあなたのダブルスを初期化し、あなたは今それをやっているとのparamsから文字列を取得し


public class BackgroundTask extends AsyncTask { 

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

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

でなければなりません。

関連する問題