2016-04-13 9 views
-1

私はAndroidの初心者ですから、何か助けが必要です。ですから、私は内部にサブプロシージャを持ったプロシージャを持っています。新しいものを始める前に、どうやって完成させることができますか?ここではよりよく理解するためのコードは次のとおりです。新しいものを開始する前に手順を完了

public void onCellLocationChanged(CellLocation lokacija) { 
     super.onCellLocationChanged(lokacija); 
     location = (GsmCellLocation) Phone.getCellLocation(); 
     textCellId.setText(String.valueOf(location.getCid() % 65536)); 
     textCellLac.setText(String.valueOf(location.getLac())); 
     String JSON_URL_string=JSON_URL + "?cellid=" + String.valueOf(location.getCid()%65636); 
     getJSON(JSON_URL_string); 
     myJSONString = textCellNameSakriven.getText().toString(); 
     ParseJSON(myJSONString); 
    } 

問題はtextCEllNameSkrivenも空である原因myJSONStringは、空であることです。そのtextView textCellNameSkrivenは、getJSON(JSON_URL_string)が終了したときに作成されます。デバッガを実行してステップバイステップを実行すると、アプリケーションは直接getJSON(JSON_URL_string)行から次のものへ次のものに移動します。

編集:おそらく問題は、onPostExecuteがParseJSONを開始する前に終了していないことです。そう

private void getJSON(String url) { 
     class GetJSON extends AsyncTask<String, Void, String> { 
      ProgressDialog loading; 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       loading = ProgressDialog.show(MainActivity.this, "Please Wait...", null, true, true); 
      } 

      @Override 
      protected String doInBackground(String... params) { 

       String uri = params[0]; 

       BufferedReader bufferedReader = null; 
       try { 
        URL url = new URL(uri); 
        HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
        StringBuilder sb = new StringBuilder(); 

        bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream())); 
        String json; 
        while ((json = bufferedReader.readLine()) != null) { 
         sb.append(json + "\n"); 

        } 

        return sb.toString().trim(); 

       } catch (Exception e) { 
        return null; 
       } 

      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       loading.dismiss(); 
       textCellNameSakriven.setText(s); 
      } 
     } 
     GetJSON gj = new GetJSON(); 
     gj.execute(url); 

    } 

答えて

0

あなたgetJson方法は、実行後のを待つ必要はなく、非同期タスクを開始した後に返すことができますので、あなたは、それが実質的に異なるスレッド上で動作する非同期タスクを実行しているので、:ここでgetJSONのコードもありますこのようにして、textViewが読み込まれた後にparseJsonが実行されることを決して確認することはできません。あなたは古典的な競争状態の問題にぶつかっています。

あなたがpostExecuteが行われた後に呼び出されるコールバックを持っている場合、あなたの問題は簡単に解決することができ、あなたがそうそこ

をparseJsonを扱うことができ、単純なもののように、MyCallback

public interface MyCallback { 
    public OnReadJsonDone(); 
} 

インターフェイスを作成

あなたの活動は

public MainActivity implements MyCallback 
{ 
    ........... 
    @Override 
    public OnReadJsonDone(){ 
     parseJson(); 
    } 

今すぐ

にgetJsonの署名を変更するには、このMyCallbackを実装してみましょうgetJSonが

getJSON(JSON_URL_string,this); 

はこれをテストしていませんが、あなたはアイデア

を得る第二のparamとして、これを渡す呼び出し中だから、あなたが今必要なのは、あるonpostexecute

//call OnReadJsonDone 
callback.OnReadJsonDone() 

で今すぐ

getJSON(string json, final MyCallback callback) { 

+0

こんにちは、ありがとうございました。あなたはコードで解決策を教えてもらえますか?前もって感謝します。 –

+0

は簡単な概要を示しており、そこからは安心していただけます –