我有一个类loadDAta(),它包含一个从服务器获取json的方法,例如loadData(String url)。我根据选项
来调用它import android.text.format.DateFormat;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Date;
import cz.msebera.android.httpclient.Header;
public class loadDAta{
private AsyncHttpClient client=new AsyncHttpClient();
public void loadDatas(String url) {
client.post(url, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
try {
int st = response.getInt("st");
int timest = response.getInt("t");
Date dateTime = new Date(timest);
String dateString = (String) DateFormat.format("dd:MM:yyyy \t\t hh:mm:ss", dateTime);
double val = response.getDouble("v");
Data data=new Data();
data.setDate(dateString);
data.setValue(val);
data.setState(st);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
我在另一个名为Data()
的类中设置这些值public class Data {
private String date,url;
private double value;
private int state;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getURL() {
return url;
}
public void setURL(String url) {
this.url = url;
}
}
当我从另一个类
调用时,loadData()方法内的操作不执行loadDAta lds=new loadDAta();
lds.loadDatas(myUrl);
Data dat=new Data();
date1=dat.getDate();
val=dat.getValue();
st=dat.getState();
那么得到这里的值是,当它是字符串然后没有,当它是int然后是0,当它是双倍然后0.0
我的代码对该方法调用有什么问题....
答案 0 :(得分:2)
我会将班级loadDAta
(原文如此)重命名为DataLoader
。如果您为该类的主要作业命名该类,那么您(或其他开发人员)永远不会有任何混淆!
此外,您没有收到正确的变量信息的原因是因为在onSuccess()
中的loadDatas(String url)
,您正在使用Data
初始化新的Data data=new Data();
(为此,让我们将一个实例看作一个变量容器)。然后你设置数据,但你对你的实例什么都不做!你让Data
的实例死了,你的变量就会死掉。
然后在最后再次尝试Data data=new Data();
,这会产生一个新的,干净的空Data
实例。这个实例对上面调用中传递给兄弟的数据一无所知,因为它们是不同的实例。
要实现您的目标,您需要将完全初始化的Data
对象传递到需要变量的位置。
例如:
Data data = new Data();
data.setDate(dateString);
System.out.println(data.getDate()); //THIS WILL PRINT dateString CORRECTLY
Data data2 = new Data();
System.out.println(data2.getDate()); //THIS WILL NOT, BECAUSE THIS INSTANCE DOES NOT HAVE THE date VARIABLE SET!!!
现在您希望了解为什么会发生这种情况,让我们来解决问题。最优雅的解决方案是允许loadDatas()
返回一个实例化的Data
对象,如下所示:
public Data loadDatas(String url) {
final Data data = new Data();
client.post(url, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
try {
int st = response.getInt("st");
int timest = response.getInt("t");
Date dateTime = new Date(timest);
String dateString = (String) DateFormat.format("dd:MM:yyyy \t\t hh:mm:ss", dateTime);
double val = response.getDouble("v");
data.setDate(dateString);
data.setValue(val);
data.setState(st);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return data;
}
然后我们可以致电Data data = DataLoader.loadDatas(String)
,data
将包含您需要的预期信息。
为了更好地理解,我建议阅读官方的Oracle文档,Understanding Class Members。
快乐的编码! :)
答案 1 :(得分:0)
是的,你有问题。
Data dat=new Data();
在这里,您要创建一个新的Data
对象,因此该对象中的所有字段都是空的。而是执行以下操作:
loadDAta lds=new loadDAta();
Data dat = lds.loadDatas(myUrl);
date1=dat.getDate();
val=dat.getValue();
st=dat.getState();
现在这将有效。确保loadDatas()
方法返回Data
个对象。