在开始新程序之前完成程序

时间:2016-04-13 13:31:44

标签: android json

我是Android的初学者,我需要一些帮助。所以,我有一个子程序里面的程序。如何在开始新的之前完成一个。这是一个更好理解的代码:

public void onCellLocationChanged(CellLocation lokacija) {
        super.onCellLocationChanged(lokacija);
        location = (GsmCellLocation) Phone.getCellLocation();
        textCellId.setText(String.valueOf(location.getCid() % 65536));
        textCellLac.setText(String.valueOf(location.getLac()));
        String JSON_URL_string=JSON_URL + "?cellid=" + String.valueOf(location.getCid()%65636);
        getJSON(JSON_URL_string);
        myJSONString = textCellNameSakriven.getText().toString();
        ParseJSON(myJSONString);
    }

问题是myJSONString为空,导致textCEllNameSkriven也为空。当getJSON(JSON_URL_string)完成时,将生成textView textCellNameSkriven。如果我运行调试器并逐步执行,应用程序直接从getJSON(JSON_URL_string)行转到下一个和下一个等

编辑:可能问题是在启动ParseJSON之前onPostExecute没有完成。这里也是getJSON的代码:

private void getJSON(String url) {
        class GetJSON extends AsyncTask<String, Void, String> {
            ProgressDialog loading;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(MainActivity.this, "Please Wait...", null, true, true);
            }

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

                String uri = params[0];

                BufferedReader bufferedReader = null;
                try {
                    URL url = new URL(uri);
                    HttpURLConnection con = (HttpURLConnection) url.openConnection();
                    StringBuilder sb = new StringBuilder();

                    bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    String json;
                    while ((json = bufferedReader.readLine()) != null) {
                        sb.append(json + "\n");

                    }

                    return sb.toString().trim();

                } catch (Exception e) {
                    return null;
                }

            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                textCellNameSakriven.setText(s);
            }
        }
        GetJSON gj = new GetJSON();
        gj.execute(url);

    }

1 个答案:

答案 0 :(得分:0)

由于您正在运行异步任务,它实际上在不同的线程上运行,因此您的getJson方法不需要等待后执行并且可以在启动异步任务后返回,因此您永远无法确保以这种方式执行parseJson填充textView后。你遇到了经典的竞争条件问题。

你的问题很容易解决,如果你有一个在postExecute完成后调用的回调,你可以在那里处理parseJson

所以,简单的事情,创建接口MyCallback

public interface MyCallback {
    public OnReadJsonDone();
}

让您的活动实现此MyCallback

public MainActivity implements MyCallback
{
  ...........
  @Override
   public OnReadJsonDone(){
      parseJson();
   }

现在将getJson的签名更改为

getJSON(string json, final MyCallback callback) {

现在在onpostexecute

//call OnReadJsonDone
callback.OnReadJsonDone()

所以,你现在需要的只是在调用getJSon时将其作为第二个参数传递给

 getJSON(JSON_URL_string,this);

Haven没有测试过这个,但你明白了