0

この点に関して多くの問題と例を調べましたが、問題を理解して解決することができませんでした。問題は、AsyncTask クラスの InBackground メソッドから String 配列を、データに対していくつかのプロセスが発生する別のクラスに取得する必要があることです。

ここに私の myMapService クラスがあります:

public class myMapService extends AsyncTask<String, Void, String[]> {
    private ProgressDialog progressDialog;
    private keyword activity;

    private String rst = " " ; 

    private String[] strArr1;
    private String[] strArr2;
    private String[] resultList;

    public String[] getResultList() { return this.resultList; }


    public myMapService(keyword activity, ProgressDialog progressDialog)
    {
        this.activity = activity;
        this.progressDialog = progressDialog;
    }



    @Override
    protected void onPreExecute()
    {
        progressDialog.show();
    }


    @Override
    protected String[] doInBackground(String... arg0) {


        String result = "";
        int responseCode = 0;

        int executeCount = 0;
        HttpResponse response;

        StringBuilder sb = new StringBuilder();
        String line;
        try 
        {
            HttpClient client = new DefaultHttpClient();
            HttpGet httppost = new HttpGet("http://XXX.com/ccvo/mel-asset-data/query.php?lon="+ arg0[0].toString() + "&lat="+ arg0[1].toString() +"&within=" + arg0[2].toString()  + "&keyword="+ arg0[3].toString().replace(" ", "%20"));


            Log.v("Results", "from web: " + arg0[0]);
            Log.v("Results", "from web: " + arg0[1]);
            Log.v("Results", "from web: " + arg0[2]);
            Log.v("Results", "from web: " + arg0[3]);


                do
                {
                    progressDialog.setMessage("Passing paratmeters.. ("+(executeCount+1)+"/5)");
                    // Execute HTTP Post Request
                    executeCount++;
                    response = client.execute(httppost);
                    responseCode = response.getStatusLine().getStatusCode();                        

                } while (executeCount < 5 && responseCode == 408);

                BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                while ((line = rd.readLine()) != null)
                {
                    result = line.trim();
                    sb.append(line);

                }
        }catch (Exception e2) {
            responseCode = 408;
            e2.printStackTrace();
            }
        rst = result.toString();


// splits everything        
        if(rst != null && rst.length() > 0)
        {
          strArr1 = rst.split("\\|");
          for(int i=0;i<strArr1.length;i++)
          {


                Log.d("Results", "Array size1.1 "  + i);

            Log.v("Results", "Array split1.2 "  + strArr1[i] );


            if(strArr1[i] != null && strArr1[i].length() >0 && strArr1[i].contains(","))
            {

           strArr2 = strArr1[i].split(",");
              for(int j=0; j<strArr2.length ;j++)
              {
                 // strArr3[i][j] = strArr2[j].toString();

                  if(strArr2.length == 4)
                  {

                    // int temp =  Integer.parseInt(strArr2[j]) ;
                    //  strArr2[j] = Integer.toString(Integer.parseInt(strArr2[j])) ;
                  }
                    Log.d("Results", "Array size2.3 "  + j );

                Log.d("Results", "Array split2.4 "  + strArr2[j] );


              }
            }
          }
        }



/*      if(rst != null && rst.length() > 0)
        {
          strArr = rst.split("\\|");

          for(int i=0;i<strArr.length;i++)
          {
            Log.d("Results", "Array split 1: " + strArr[i]);
           // Log.d("Results", "Array split 2: " + arrfetch[i]);

          }
        }
        */
        this.resultList = strArr2; 

        return strArr2;
    }



@Override
protected void onPostExecute(String[] strArr2)
{
    progressDialog.dismiss();

}

}

strArr2 配列は、カテゴリ、緯度、経度、距離の値を返します。このクラスはボタン リスナーを介して起動されますが、マップは使用可能なオブジェクトを表示します。私の keyword.java で:

View firstButton = findViewById(R.id.button1);
firstButton.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {

    gps = new GPSTracker(keyword.this);



    // check if GPS enabled


        String latitude = Double.toString(gps.getLatitude());
        String longitude = Double.toString(gps.getLongitude());

        ProgressDialog progressDialog = new ProgressDialog(keyword.this);
        progressDialog.setCancelable(false);

        myMapService myMapService = new myMapService(keyword.this, progressDialog);
        myMapService.execute(longitude.toString(),latitude.toString(), withinn.toString(), keywordSeleced.toString() );


        Intent i = new Intent(getBaseContext(), GoogleMapsAppActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    getApplicationContext().startActivity(i);


        }
        });

MapActivity を拡張する GoogleMapsAppActivity.java で AsyncTask クラスの結果を使用する必要があります。これらの値を次の行に渡す必要があります。

 Drawable makerDefault = this.getResources().getDrawable(R.drawable.poke);
 MirItemizedOverlay itemizedOverlay = new MirItemizedOverlay(makerDefault);
 itemizedOverlay.addOverlayItem((int) (1E6 * -37.720754), (int) (1E6 * 145.048798), "La trobe");
 mapView.getOverlays().add(itemizedOverlay);
 MapController mc = mapView.getController();
 mc.setCenter(new GeoPoint((int) (1E6 * -37.720754), (int) (1E6 * 145.048798))); /
 mc.zoomToSpan(itemizedOverlay.getLatSpanE6(), itemizedOverlay.getLonSpanE6());

どんな助けでも本当に感謝しています。前もって感謝します。

4

2 に答える 2

1

これらの行を含むメソッドをonPostExecute()呼び出す必要があります。GoogleMapsAppActivity

于 2012-10-13T19:51:00.447 に答える
0

onPostExecute() メソッドで:

super.onPostExecute(strArr2);

strArr2 を呼び出し元のクラスに返します

myMapService.execute() の後の呼び出しアクティビティで:

String[] results = myMapService.get();
//results == strArr2

そのように簡単です!

于 2012-10-13T21:39:43.017 に答える