xAnGz
xAnGz

Reputation: 127

ANR force close when running this code

This code is causing ANR force close any idea how to improve this code? i try with asynctask and i cant make it work in this code :

What i try to do here is updater activity will check for latest version and if got new version it will pop up alertdialog to ask user to update in the market

public class Updater extends Activity {

    private int newVerCode = 0;
    private String newVerName = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        if (getServerVerCode()) {
            int vercode = Config.getVerCode(this);
            if (newVerCode > vercode) {
                doNewVersionUpdate();

            } else {
                notNewVersionShow();
            }
        }

    }
//check version using json
    private boolean getServerVerCode() {
        try {
            String verjson = NetworkTool.getContent(Config.UPDATE_SERVER
                    + Config.UPDATE_VERJSON);
            JSONArray array = new JSONArray(verjson);
            if (array.length() > 0) {
                JSONObject obj = array.getJSONObject(0);
                try {
                    newVerCode = Integer.parseInt(obj.getString("verCode"));
                    newVerName = obj.getString("verName");
                } catch (Exception e) {
                    newVerCode = -1;
                    newVerName = "";
                    return false;
                }
            }
        } catch (Exception e) {

            return false;

        }
        return true;
    }
//Found No new version
    private void notNewVersionShow() {
        Updater.this.finish(); // End updater activity
    }

//Found New version
    private void doNewVersionUpdate() {
//Display alertdialog
    }
}

Upvotes: 1

Views: 175

Answers (1)

Maria Neumayer
Maria Neumayer

Reputation: 3357

You can use an AsyncTask - yes. In doInBackground you can add the code from getServerVerCode() and in onPostExecute everything in the if (getServerVerCode()). doInBackground can return boolean so you know in onPostExecute what the result is. Something like this:

private class GetServerVerCode extends AsyncTask<Void, Void, Boolean> { 

    @Override 
    protected Boolean doInBackground(Void... params) {
      try {
        String verjson = NetworkTool.getContent(Config.UPDATE_SERVER
                + Config.UPDATE_VERJSON);
        JSONArray array = new JSONArray(verjson);
        if (array.length() > 0) {
            JSONObject obj = array.getJSONObject(0);
            try {
                newVerCode = Integer.parseInt(obj.getString("verCode"));
                newVerName = obj.getString("verName");
            } catch (Exception e) {
                newVerCode = -1;
                newVerName = "";
                return false;
            }
        }
    } catch (Exception e) {

        return false;

    }
    return true;
    } 

    @Override
    protected void onPostExecute(Boolean result) {
        if (result) {
            int vercode = Config.getVerCode(this);
            if (newVerCode > vercode) {
                doNewVersionUpdate();

            } else {
                notNewVersionShow();
            }
        }
    }
}

Upvotes: 2

Related Questions