Java Android Studio变量未从函数调用更新
这可能是一个基本的Java问题。在同一个活动中,我声明了一个字符串[]数据,随后成功地对其进行了更新,但当我试图从更新数据[1]的调用函数中将textview设置为更新数据[1]时,没有显示任何内容。这是精简的代码Java Android Studio变量未从函数调用更新,java,android,Java,Android,这可能是一个基本的Java问题。在同一个活动中,我声明了一个字符串[]数据,随后成功地对其进行了更新,但当我试图从更新数据[1]的调用函数中将textview设置为更新数据[1]时,没有显示任何内容。这是精简的代码 public class MyClass extends AppCompatActivity { String[] data = new String[4]; public void populateGrid() {}
public class MyClass extends AppCompatActivity {
String[] data = new String[4];
public void populateGrid() {}
getIndexData(indices);
final TextView test = (TextView) findViewById(R.id.textView0B);
test.post(new Runnable() {
@Override
public void run() {
test.setText(data[1]);
}
});
public void getIndexData(final String[] indices){
//lots of work accomplished, data[1] is updated, Log.d() logs good!
// Tried passing data[] as a parameter from populateGrid(), but that didn't work.
// Tried returning data[] to populateGrid(), also didn't work.
}
}
完成这项任务的正确方法是什么
根据请求,getIndexData()
public void getIndexData(最终字符串索引){
mOkHttpClient=new-OkHttpClient();
HttpUrl请求URL=HttpUrl.parse(“http://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=" +
指数+
“&outputsize=compact&apikey=”+
阿皮奇);
Request Request=newrequest.Builder().url(reqUrl.build();
mOkHttpClient.newCall(request).enqueue(newcallback()){
@凌驾
公共void onFailure(调用调用,IOE异常){
//如果未连接到internet等,则显示用户错误消息。
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
Context=getApplicationContext();
CharSequence text=getResources().getString(R.string.Toast_1);
int duration=Toast.LENGTH\u LONG;
Toast Toast=Toast.makeText(上下文、文本、持续时间);
toast.show();
}
});
}
@凌驾
public void onResponse(调用调用、响应响应)引发IOException{
int j=0;
String responseBody=response.body().String();
if(responseBody.contains(“\”错误消息\”)){
数据[j]=“无数据”;
数据[j+1]=“无数据”;
数据[j+2]=“无数据”;
数据[j+3]=“无数据”;
}else{//从json对象中提取数据点。
试一试{
JSONObject baseObject=新的JSONObject(ResponseBy);
JSONObject timeSeriesObj=baseObject.optJSONObject(“时间序列(每日)”;
迭代器迭代器=timeSeriesObj.keys();
List tickerData=new ArrayList();
while(iterator.hasNext()){
String key=iterator.next();
if(key!=null){
HashMap m=新的HashMap();
JSONObject finalObj=timeSeriesObj.optJSONObject(键);
m、 put(“1.打开”,finalObj.optString(“1.打开”);
m、 看跌期权(“2.high”,finalObj.optString(“2.high”);
m、 看跌期权(“3.low”,finalObj.optString(“3.low”);
m、 卖出(“4.收盘”,finalObj.期权字符串(“4.收盘”);
m、 卖出(“5.成交量”,finalObj.期权交易(“5.成交量”);
tickerData.add(m);
}
}
int k=0;
String str=tickerData.get(0.toString();
数据[k]=StringUtils.substringBetween(str,“open=”,“,”);
//Log.d(“数据[0]=”,数据[0]);
数据[k+1]=StringUtils.substringBetween(str,“close=”,“,”);
Log.d(“数据[1]”,数据[1]);//日志2431.7700
数据[k+2]=“”;
数据[k+3]=“”;
}捕获(JSONException e){
e、 printStackTrace();
}
}
}
});
}
应该是这样的:
公共类MyClass扩展了AppCompatActivity{
字符串[]数据=新字符串[4];
public void populateGrid(){
getIndexData(索引);
}
public void getIndexData(最终字符串索引){
//设置http请求
mOkHttpClient.newCall(request).enqueue(newcallback()){
@凌驾
公共void onFailure(调用调用,IOE异常){
// ...
}
@凌驾
public void onResponse(调用调用、响应响应)引发IOException{
//处理响应、填充数据等。
最终TextView测试=(TextView)findViewById(R.id.textView0B);
test.post(新的Runnable(){
@凌驾
公开募捐{
test.setText(数据[1]);
}
});
}
}
}
}
请发布getIndexData()
代码的相关部分。在其中,您是在更新数据
还是索引
?您不能只做test.setText()
而不做test.post()
?另外,我建议您进行步进调试,在主线程上运行所有操作?这是对api的okHttp请求和响应。我在getIndexData()中更新数据[]数组。索引[]用于输入以派生数据[]。数据[]数组在getIndexData()中记录良好@nandsito-不,致命的例外:okHttpdispatcher只有创建层次结构的原始线程才能接触它的视图。准确地说!我甚至可以从那里设置一个新的函数调用来映射所有的数据点。感谢您坚持我的观点!
public void getIndexData(final String indices){
mOkHttpClient = new OkHttpClient();
HttpUrl reqUrl = HttpUrl.parse("http://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=" +
indices +
"&outputsize=compact&apikey=" +
apiKey);
Request request = new Request.Builder().url(reqUrl).build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// Show user error message if not connected to internet, et. al.
runOnUiThread(new Runnable() {
@Override
public void run() {
Context context = getApplicationContext();
CharSequence text = getResources().getString(R.string.Toast_1);
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
int j = 0;
String responseBody = response.body().string();
if (responseBody.contains("\"Error Message\"")) {
data[j] = "No Data";
data[j+1] = "No Data";
data[j+2] = "No Data";
data[j+3] = "No Data";
} else { // Extract data points from json object.
try {
JSONObject baseObject = new JSONObject(responseBody);
JSONObject timeSeriesObj = baseObject.optJSONObject("Time Series (Daily)");
Iterator<String> iterator = timeSeriesObj.keys();
List<Map<String, String>> tickerData = new ArrayList<Map<String, String>>();
while (iterator.hasNext()) {
String key = iterator.next();
if (key != null) {
HashMap<String, String> m = new HashMap<String, String>();
JSONObject finalObj = timeSeriesObj.optJSONObject(key);
m.put("1. open", finalObj.optString("1. open"));
m.put("2. high", finalObj.optString("2. high"));
m.put("3. low", finalObj.optString("3. low"));
m.put("4. close", finalObj.optString("4. close"));
m.put("5. volume", finalObj.optString("5. volume"));
tickerData.add(m);
}
}
int k = 0;
String str = tickerData.get(0).toString();
data[k] = StringUtils.substringBetween(str, "open=", ", ");
//Log.d("data[0]= ", data[0]);
data[k+1] = StringUtils.substringBetween(str, "close=", ", ");
Log.d("data[1]", data[1]); // logs 2431.7700
data[k+2] = "";
data[k+3] = "";
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
}