当前位置: 首页 > 知识库问答 >
问题:

获取数组与JSON和Android应用程序

蒲寂离
2023-03-14

我试图创建一个Android应用程序使用PHP和json远程服务器上的数据库。我运行的查询假设返回一行作为答案,似乎有一个问题,因为json数组总是返回空。这是我的JSON类代码:

public class JSONClass extends AsyncTask<String,Void,String>{

    public JSONArray res = null;
    private String link;

    private Context context;

    public JSONClass(Context context, int queryNo, String params) {
        this.context = context;
        link = "http://pickupfriend.fulba.com/android_project/query" + queryNo + ".php" + params;
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    @Override
    protected String doInBackground(String... arg0) {

        try{
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(link);
            post.addHeader("Content-Type", "application/x-www-form-urlencoded");

            HttpResponse response = client.execute(post);
            HttpEntity entity = response.getEntity();
            String result = EntityUtils.toString(entity, "utf-8");
            res = new JSONArray(result);

        }catch(Exception e){

        }
        return "";
    }
}

我就是这样使用这个类的:EditText userNam=(EditText)findviewbyd(R.id.userNamTxt);EditText pass=(EditText)findViewById(R.id.pssTxt);

String uName,Pss;

uName = userNam.getText().toString();
Pss = pass.getText().toString();

String str = "?uname=" + uName + "&password=" + Pss;

JSONClass jClass = (JSONClass) new JSONClass(this, 1, str).execute();
res = jClass.res;

php链接是:http://pickupfriend.fulba.com/android_project/query1.php?uname=itzick

共有2个答案

麹高义
2023-03-14

异步任务以异步方式进行。execute()函数启动异步任务并继续执行代码。在您的例子中,它执行res=jClass。res

完成时,Asynctask执行函数OnPostExecute(),如中所示

public class JSONClass extends AsyncTask<String,Void,String>{

public JSONArray res = null;
private String link;

private Context context;

public JSONClass(Context context, int queryNo, String params) {
    this.context = context;
    link = "http://pickupfriend.fulba.com/android_project/query" + queryNo + ".php" + params;
}

@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
protected String doInBackground(String... arg0) {

    try{
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(link);
        post.addHeader("Content-Type", "application/x-www-form-urlencoded");

        HttpResponse response = client.execute(post);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity, "utf-8");


    }catch(Exception e){

    }
    return result;
}
@Override
protected void onPostExecute(Void result) {
    //result is sent here. now 
JSONArray res = new JSONArray(result);
//Do what you want with JSONArray
}

}

现在,如果您只能在活动中执行您想要的操作,而不能在异步任务中执行,则必须使用处理程序将数据发送回活动。

要生成处理程序,请将其添加到正在调用异步任务的活动或片段中

Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        Bundle bundle = msg.getData();
        String result = bundle.getString("JSONRESULT");
        JSONArray res = new JSONArray(result);
        //Now do what you want here
    }
}

在初始化asynctask时,也添加处理程序对象

private Handler handler;
public JSONClass(Context context, int queryNo, String params) {
    this.context = context;
    link = "http://pickupfriend.fulba.com/android_project/query" + queryNo + ".php" + params;
    this.handler=handler;
}

不要忘记在初始化时将其与活动中的参数一起传递。

同样在OnPostExecute中

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    try {
        Bundle bundle = new Bundle();
        bundle.putString("JSONRESULT", result);
        Message msg = new Message();
        msg.setData(bundle);
        handler.sendMessage(msg);
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
}

帅彦
2023-03-14

您使用AsyncTask时似乎有问题。您不应该得到结果res=jClass。res就在execute()之后,因为您可能还没有得到HTTP响应。也许这就是当你说你的长度是0时,你得到的错误,对象实际上是空的。

在AsyncTask的onPostExecute()方法中收到数据后,应该相应地更新UI。大概是这样的:

public class JSONClass extends AsyncTask<String,Void,JSONArray>{
    ...

    @TargetApi(Build.VERSION_CODES.KITKAT)
    @Override
    protected JSONArray doInBackground(String... arg0) {
        ...
        String result = EntityUtils.toString(entity, "utf-8");
        return new JSONArray(result);
    }

    protected void onPostExecute(JSONArray result) {
        // DO WHATEVER YOU WANT IN YOUR UI
    }

}

 类似资料:
  • 问题内容: 上面的示例json数组,如何获取204、203和202?谢谢 我试过了: 问题答案: 上面的示例json数组,如何获取204、203和202? 不,当前的String 代替。您应该使用JSONObject获取Iterator 。keys()如果内部JSONObject键动态为:

  • 我正在为课堂做一个程序。到目前为止,我已经完成了1-3个,但我不知道如何实现4和5个。我已经被困在这上面一段时间了。必须使用两个类。 null 其他类

  • 我可以很容易地得到消息,但我不能从响应中得到“他”数组。 下面是我的数据模型类 这就是我向服务器发送请求的方式:

  • 我们的中央银行以多种方式提供货币汇率。例如,一个货币日期很容易获得:http://api.nbp.pl/api/exchangerates/rates/a/usd/2020-08-20?format=Json(它以简单的大括号开始{作为典型的Json) 但是另一个表-每个货币日期:http://api.nbp.pl/api/exchangerates/tables/a/2020-08-20?for

  • 您好,我有这个代码,我想将此数据解析为对象,现在我得到了一个 anyType 的字符串 我想分别得到描述对象纬度对象和经度对象

  • 我想从Firebase实时数据库中获取整个JSON数组。从实时数据库中提取数组并将其存储在自定义类的ArrayList中。