2017-01-26 5 views
0

Я хочу показать строку из другой строки в моей MainActivity, но строка печатается на консоли. Вот мой код:Невозможно получить доступ к строке из класса

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()); 
      } 
     }); 
    } 
} 

А класс:

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

Асинхронность выполняется в другом потоке. В настоящее время вы устанавливаете строку перед завершением задачи. Задайте строку в методе 'onPostExecute'. –

+0

Я думаю, что когда вы нажимаете кнопку, чтобы запустить задачу, задача не успевает установить 'finalString', прежде чем вы установите ее в' TextView' – Sunshinator

ответ

0

Вы требуете finalString, прежде чем он заполнен данными. onPostExecute выполняется после doInBackground, так что вы должны передать свой вид текста для вашей задачи и установите его значение в 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

Проблема в том, что showText.setText(click1.getString()); вашей деятельности называется раньше, чем finalString = object.getString("text"); вашей задачи.

Решение:

Создание интерфейса:

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

и реализовать его в вашей деятельности:

public class MainActivity extends ... implements DataCallback 

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

Передайте интерфейс к вашему AsyncTask при ее создании:

RetrieveFeedTask click1 = new RetrieveFeedTask(this); 

Вызов интерфейса внутри задачи в onPostExecute() уведомить деятельность, что есть новые данные:

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

callback.onNewData(finalString); 
Смежные вопросы