【问题标题】:How to pass two different JSON Objects to processFinish at two different times如何在两个不同的时间将两个不同的 JSON 对象传递给 processFinish
【发布时间】:2017-09-18 19:00:25
【问题描述】:

我有这个MainActivity,它执行两个HTTP 调用并将JSON 对象返回给MainActivity 类。我已经单独实现了 AsyncTask 类并使用AsyncResponse 接口通过processFinish 函数调用将JSON 对象获取到MainActivity

起初我想出了一个完美运行的 HTTP 调用。 其次,我想在同一个活动类中进行另一个 HTTP 调用。所以我编辑了代码来满足第二个 HTTP 调用。

当我运行应用程序时,只有第一个 HTTP 调用有效。当我调用第二个 HTTP 调用时,它会抛出一个 exceptionreference to a null object

然后我通过记录调用 processFinish 函数的 onPostExecute 方法进行检查。在那里我可以看到 JSON 对象。所以,这意味着第二个 JSON 对象没有到达 processFinish

如何管理第二个 HTTP 调用?请帮我!我是 Android 新手。

以下是我的AsyncTask 类...

public class ServiceHandler extends AsyncTask<String, Void, JSONObject> {

    String startStationID;
    String endStationID;
    String searchDate;
    String startTime;
    String endTime;

    public ServiceHandler(String startStationID, String endStationID, String searchDate, String startTime, String endTime) {
        this.startStationID = startStationID;
        this.endStationID = endStationID;
        this.searchDate = searchDate;
        this.startTime = startTime;
        this.endTime = endTime;
    }

    public interface AsyncResponse {
        void processFinish(JSONObject output);
    }

    public AsyncResponse delegate=null;

    public ServiceHandler(AsyncResponse delegate) {
        this.delegate = delegate;
    }

    @Override
    protected JSONObject doInBackground(String... params) {

        String method = params[0];
        JSONObject JSON_Object = null;


        if (method.equals("getStations")) {

            JSON_Object = Constants.apiCall("http://api.lankagate.gov.lk:8280/railway/1.0/station/getAll?lang=en");

        } else if (method.equals("searchTrains")) {
            JSON_Object = Constants.apiCall("http://api.lankagate.gov.lk:8280/railway/1.0/train/searchTrain?" +
                    "startStationID="+this.startStationID+"&" +
                    "endStationID="+this.endStationID+"&" +
                    "searchDate="+this.searchDate+"&" +
                    "startTime="+this.startTime+"&" +
                    "endTime="+this.endTime+"&" +
                    "lang=en");
        }
        return JSON_Object;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(JSONObject obj) {
        try{
Log.d("onPostExecute",obj.toString());
            delegate.processFinish(obj);

        }catch (Exception e){
            Log.e("onPostExecute",e.getMessage());
        }

    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
}

以下是我的processFinish 函数...

    @Override
    public void processFinish(JSONObject output) {
        Log.d("processFinish",output.toString());

        if(!isSearchClicked) {
            //Get all the stations...
            if (output != null) {
                Toast.makeText(MainActivity.this, "Successfully Connected!", Toast.LENGTH_SHORT).show();
                try {
                    JSONObject obj = output.getJSONObject("RESULTS");
                    output = null;
                    JSONArray dataArray = obj.getJSONArray("stationList");

                    for (int i = 0; i < dataArray.length(); i++) {
                        JSONObject object1 = dataArray.getJSONObject(i);

                        String stationID = object1.getString("stationID");
                        String stationName = object1.getString("stationName");

                        stationNames.add(stationName);
                        stationIDs.add(stationID);
//                    stations.put(stationID,stationName);

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(MainActivity.this, " Connection Failed!", Toast.LENGTH_SHORT).show();
            }
        }else {
            //search click action...
            if (output != null) {
                Toast.makeText(MainActivity.this, "Successfully Searched!", Toast.LENGTH_SHORT).show();


                try {
                    JSONObject obj = output.getJSONObject("RESULTS");
                    JSONArray directTrains = obj.getJSONArray("directTrains");


//                    Log.d("array size",String.valueOf(directTrains.length()));
//                    for (int i = 0; i < directTrains.length(); i++) {
//                        JSONObject object1 = directTrains.getJSONObject(i);
//
//                        String stationID = object1.getString("stationID");
//                        String stationName = object1.getString("stationName");
//                        Log.d("JArr", stationID + " : " + stationName);
//
//                        stationNames.add(stationName);
//                        stationIDs.add(stationID);
////                    stations.put(stationID,stationName);
//                    }
//                    Log.d("stationNames", stationNames.toString());

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(MainActivity.this, " Connection Failed!", Toast.LENGTH_SHORT).show();
                Log.d("output",output.toString());
            }
        }
    }

以下是我的第一个 HTTP 调用...

ServiceHandler sh = new ServiceHandler(this);

String method = "getStations";
sh.execute(method);

以下是我的第二个 HTTP 调用...

String method = "searchTrains"
        ServiceHandler sh = new ServiceHandler(startStationID,endStationID,searchDate,startTime,endTime);
        sh.execute(method);

【问题讨论】:

  • 我不明白你的问题。第二个 http 调用在哪里?
  • @PedroVarela 我在最后添加了 HTTP 调用..
  • 阅读我的答案,更改那些异步任务并阅读有关意图服务和广播接收器(使用本地广播而不是全局广播)

标签: java android json android-asynctask


【解决方案1】:

虽然我不明白你的问题是什么。我建议你做几件事。

我来了。

  1. 不要使用 AsyncTask 进行 http 调用,而是使用 Intent 服务。
  2. 为您的网络使用 OkHTTP 库source
  3. 在您的意图服务上使用 LocalBroadcastManager 发送本地广播,以广播您的 http 调用结果。
  4. 在您的活动或片段中注册广播接收器,以侦听来自意图服务的广播

为什么不使用 AsyncTask:由于配置更改 - 如果您旋转设备,您将失去该网络呼叫 -

阅读意图服务here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多