Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从类中访问字符串_Java_Android_Json_Api - Fatal编程技术网

Java 无法从类中访问字符串

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

我想在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;
    }

}
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