2017-01-26 1 views
0
nicht möglich

Ich möchte Zeichenfolge aus einer anderen Zeichenfolge in meiner MainActivity anzeigen, aber die Zeichenfolge wird in Konsole gedruckt. Hier ist mein Code:Zugriff auf Zeichenfolge aus Klasse

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

Und die Klasse:

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

Sie nie sind die Aufgabe ausgeführt wird. Ich empfehle Ihnen, mehr Tutorials zu lesen. – njzk2

+0

Die asynctask wird in einem anderen Thread ausgeführt. Derzeit legen Sie die Zeichenfolge fest, bevor die Aufgabe abgeschlossen ist. Setzen Sie den String in der 'onPostExecute' Methode. –

+0

Ich denke, wenn Sie auf die Schaltfläche klicken, um die Aufgabe zu starten, hat die Aufgabe keine Zeit, "finalString" festzulegen, bevor Sie es in der "TextView" festlegen – Sunshinator

Antwort

0

Sie das finalString erfordern, bevor es mit Ihren Daten gefüllt wird. die onPostExecute nach dem doInBackground so sollten Sie Ihren Text im Hinblick auf Ihre Aufgabe passieren ausgeführt und stellen Sie es Wert in der 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

Das Problem, dass showText.setText(click1.getString()); Ihrer Tätigkeit ist früher als finalString = object.getString("text"); Ihrer Aufgabe genannt.

Lösung:

Eine Schnittstelle:

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

und implementieren sie in Ihrer Tätigkeit:

public class MainActivity extends ... implements DataCallback 

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

Übergeben Sie die Schnittstelle zu Ihrem AsyncTask, wenn Sie es schaffen:

RetrieveFeedTask click1 = new RetrieveFeedTask(this); 

Rufen Sie die Schnittstelle innerhalb der Aufgabe in onPostExecute() die Aktivität zu benachrichtigen, dass neue Daten vorhanden sind:

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

callback.onNewData(finalString); 
Verwandte Themen