无法从java

时间:2015-10-15 18:43:28

标签: java android

我有一个类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

我的代码对该方法调用有什么问题....

2 个答案:

答案 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个对象。