2017-01-26 8 views
0

私はMainActivityの別の文字列から文字列を表示したいのですが、文字列がコンソールに表示されています。それはあなたのデータが取り込まれる前あなたはfinalStringを必要とクラスから文字列にアクセスできません

class RetrieveFeedTask extends AsyncTask<Void, Void, String> { 
    static final String API_URL = "http://numbersapi.com/random/trivia?json"; 

    private Exception exception; 
    public String finalString; 

    protected void onPreExecute() { } 

    protected String doInBackground(Void... urls) { 
     try { 
      URL url = new URL(API_URL); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try { 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
       StringBuilder stringBuilder = new StringBuilder(); 
       while ((finalString = bufferedReader.readLine()) != null) { 
        stringBuilder.append(finalString).append("\n"); 
       } 
       bufferedReader.close(); 
       return stringBuilder.toString(); 
      } 
      finally{ 
       urlConnection.disconnect(); 
      } 
     } 
     catch(Exception e) { 
      Log.e("ERROR", e.getMessage(), e); 
      return null; 
     } 
    } 

    protected void onPostExecute(String response) { 
     if(response == null) { 
      response = "THERE WAS AN ERROR"; 
     } 
     try { 
      JSONObject object = (JSONObject) new JSONTokener(response).nextValue(); 
      finalString = object.getString("text"); 

      Log.i("Here",finalString); 

     } catch (JSONException e) { 
     } 

    } 
    public String getString() { 
      return this.finalString; 
    } 

} 
+3

タスクを実行されることはありません。もっとチュートリアルを読むことをお勧めします。 – njzk2

+0

asynctaskは別のスレッドで実行されます。現在、タスクが完了する前に文字列を設定しています。 'onPostExecute'メソッドで文字列を設定します。 –

+0

タスクを開始するためにボタンをクリックすると、タスクは 'TextString'で設定する前に' finalString'を設定する時間がないと思います – Sunshinator

答えて

0

public class MainActivity extends AppCompatActivity { 

    Button start; 
    public TextView showText; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     showText= (TextView)findViewById(R.id.textView); 


     start = (Button)findViewById(R.id.button); 
     start.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       RetrieveFeedTask click1 = new RetrieveFeedTask(); 

       click1.execute(); 
       showText.setText(click1.getString()); 
      } 
     }); 
    } 
} 

とクラス:ここに私のコードです。 onPostExecuteので、あなたの仕事にあなたのテキストビューを渡す必要がありdoInBackground後に実行されると、それは問題があなたの活動のshowText.setText(click1.getString());は、あなたのタスクのfinalString = object.getString("text");より早く呼び出されることであるonPostExecute

public TextView showText; 
    public RetrieveFeedTask(TextView showText) { this.showText = showText; } 
    protected void onPostExecute(String response) { 
     if(response == null) { 
      response = "THERE WAS AN ERROR"; 
     } 
     try { 
      JSONObject object = (JSONObject) new JSONTokener(response).nextValue(); 
      finalString = object.getString("text"); 

      showText.setText(finalString); // add this 
      Log.i("Here",finalString); 

     } catch (JSONException e) { 

     } 

} 
0

の値です設定されています。

ソリューション:

public class MainActivity extends ... implements DataCallback 

public void onNewData(String data) { 
    showText.setText(data); 
} 

は、あなたがそれを作成するときに、あなたのasynctaskにインターフェイスを渡します:

インターフェイスを作成します。

public interface DataCallback { 
    void onNewData(String data); 
} 

をし、あなたの活動にそれを実装

RetrieveFeedTask click1 = new RetrieveFeedTask(this); 

新しいデータがあるという活動を通知するonPostExecute()にタスク内部インターフェイスを呼び出します。

JSONObject object = (JSONObject) new JSONTokener(response).nextValue(); 
finalString = object.getString("text"); 

callback.onNewData(finalString); 
関連する問題