Java 无法从类中访问字符串
我想在MainActivity中显示来自另一个字符串的字符串,但该字符串正在控制台中打印。这是我的密码:Java 无法从类中访问字符串,java,android,json,api,Java,Android,Json,Api,我想在MainActivity中显示来自另一个字符串的字符串,但该字符串正在控制台中打印。这是我的密码: public class MainActivity extends AppCompatActivity { Button start; public TextView showText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate
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;
}
}
class RetrieveFeedTask扩展了AsyncTask{
静态最终字符串API_URL=”http://numbersapi.com/random/trivia?json";
私人例外;
公开字符串终结;
受保护的void onPreExecute(){}
受保护的字符串doInBackground(无效…URL){
试一试{
URL=新URL(API\U URL);
HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
试一试{
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(urlConnection.getInputStream());
StringBuilder StringBuilder=新的StringBuilder();
而((finalString=bufferedReader.readLine())!=null){
stringBuilder.append(finalString.append(“\n”);
}
bufferedReader.close();
返回stringBuilder.toString();
}
最后{
urlConnection.disconnect();
}
}
捕获(例外e){
Log.e(“错误”,e.getMessage(),e);
返回null;
}
}
受保护的void onPostExecute(字符串响应){
如果(响应==null){
response=“有一个错误”;
}
试一试{
JSONObject object=(JSONObject)新的JSONTokener(response).nextValue();
finalString=object.getString(“文本”);
Log.i(“此处”,finalString);
}捕获(JSONException e){
}
}
公共字符串getString(){
把这个还给我;
}
}
在使用数据填充最终字符串之前,需要它。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) {
}
}
问题是
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);
}
创建异步任务时,将接口传递给它:
RetrieveFeedTask click1 = new RetrieveFeedTask(this);
在onPostExecute()
中调用任务内部的接口,通知活动有新数据:
JSONObject object = (JSONObject) new JSONTokener(response).nextValue();
finalString = object.getString("text");
callback.onNewData(finalString);
你永远不会执行任务。我建议您阅读更多教程。asynctask在不同的线程上运行。当前,您正在任务完成前设置字符串。在onPostExecute
方法中设置字符串。我认为当您单击按钮开始任务时,任务没有时间在TextView
中设置finalString