2017-06-30 8 views
0

私はListViewに項目のリストを読み込むAndroidアプリケーションを書いています。 ListViewには、ユーザーが選択したアイテムを識別するアダプタとonClick()メソッドが含まれています。Android開発 - 通常のコードが実行される前のAsynタスクの結果を取得

すべてがうまくいますが、onClick()には、GPSデータベースからGPS座標を取得する非同期タスクを実行するための呼び出しがあります。問題は、Asyncが完了せず、後続の操作にAsyncの座標が必要であることです。 onClick()メソッド内

new AsyncGetSkipDetails().execute(skipNo); 
             Uri gmmIntentUri = Uri.parse("google.navigation:q=" + lat + "," + lng); 
             Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); 
             mapIntent.setPackage("com.google.android.apps.maps"); 
             if (mapIntent.resolveActivity(getPackageManager()) != null) { 
              startActivity(mapIntent); 
             } 

これはGoogleマップを開き、Googleマップ上の場所を表示するには、緯度とLNGを使用しています。

マイ非同期タスク:

public class AsyncGetSkipDetails extends AsyncTask<String, String, String> { 
    ProgressDialog progress = ProgressDialog.show(PendingOrdersActivity.this, "Please Wait", "Please Wait While Skip Coordinates Are Loaded"); 
    HttpURLConnection conn; 
    URL url = null; 

    @Override 
    protected void onPreExecute() { 
     //this method will be running on UI thread 
     progress.setCancelable(false); 
     progress.isIndeterminate(); 
     progress.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      // Enter URL address where your php file resides 
      url = new URL("http://johandrefouche.ddns.net/SG/getskipdetails.inc.php"); 

     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return "exception"; 
     } 
     try { 
      // Setup HttpURLConnection class to send and receive data from php and mysql 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(READ_TIMEOUT); 
      conn.setConnectTimeout(CONNECTION_TIMEOUT); 
      conn.setRequestMethod("GET"); 

      // setDoInput and setDoOutput method depict handling of both send and receive 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 

      // Append parameters to URL 
      Uri.Builder builder = new Uri.Builder() 
        .appendQueryParameter("skipNumber", params[0]); 
      String query = builder.build().getEncodedQuery(); 

      // Open connection for sending data 
      OutputStream os = conn.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8")); 
      writer.write(query); 
      writer.flush(); 
      writer.close(); 
      os.close(); 
      conn.connect(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
      return "exception"; 

     } 

     try { 

      int response_code = conn.getResponseCode(); 

      // Check if successful connection made 
      if (response_code == HttpURLConnection.HTTP_OK) { 

       // Read data sent from server 
       InputStream input = conn.getInputStream(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
       //StringBuilder result = new StringBuilder(); 
       String line; 

       line = reader.readLine(); 


       // Pass data to onPostExecute method 
       return (line); 

      } else { 

       return ("unsuccessful"); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
      return "exception"; 
     } finally { 
      conn.disconnect(); 
     } 

    } 

    @Override 
    protected void onPostExecute(String line) { 
     //this method will be running on UI thread 
     tempSkip = line.split("<br>"); 
     progress.dismiss(); 
    } 
} 

私は緯度とLNGが戻されるまで待つことなく、助けにはならないためにプログレスバーを追加してみました。

私は非同期をテストし、onPostExecute()内から別のメソッドを呼び出すと動作します。

お願いします。 Android開発の新機能

+0

これを参照してください、https://stackoverflow.com/a/43690935/5993410 –

答えて

1

AsyncTaskは別のスレッドで実行されます。それはバックグラウンドで実行されるAsyncTaskの全ポイントです。あなたがそれが完了するのを待つならば、それを全く使う理由はありません。正解は、結果を必要とするすべてのコードをonPostExecuteに配置し、完了するまで待ち状態のUIを表示することです。

+0

すべてのコードをonPostExecuteに入れることはどういう意味ですか?または、非同期タスクを使用せずにMySQLにアクセスするWebサービスにアクセスするための別の方法がありますか? Asyncタスクに渡される変数に基づいて情報を取得する理由と、ユーザーがListView項目を選択したときにのみAsyncが呼び出される – GoodDisplayName

+0

同期タスクの結果を使用するコードがある場合は、お支払いを実行します。 –

+0

ちょうどbasicallは、Google MapsのdiplsayingのコードをonPostExecuteに入れて、今はうまくいくようです。ありがとう。 – GoodDisplayName

関連する問題