如何在两个不同的时间将两个不同的JSON对象传递给processFinish

时间:2017-09-18 19:00:26

标签: java android json android-asynctask

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

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

当我运行应用程序时,只有第一个HTTP调用正在运行。当我调用第二个HTTP调用时,它会抛出exception reference 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);

1 个答案:

答案 0 :(得分:0)

虽然我不明白你的问题是什么。我建议你做的事情很少。

我走了。

  1. 请勿使用AsyncTask进行http调用,而是使用意向服务。
  2. 使用OkHTTP库进行联网source
  3. 在您的意向服务上,使用LocalBroadcastManager发送本地广播,以从http呼叫中广播您的结果。
  4. 在您的活动中注册广播接收者或将侦听来自意图服务的广播的片段
  5. 为什么不使用AsyncTask:由于配置更改 - 如果您旋转设备,您将丢失网络电话 -

    了解意向服务here