类切换后,startActivity不起作用

时间:2018-07-29 14:36:46

标签: android json toast start-activity

我想开始一个活动并在解析JSON响应后发出Toast消息。

public class Sign_Up extends AppCompatActivity {

  ....

  register();


  public void register()
  {
  final String url = "someURL";

        new Json().checkJsonFile(url,getApplicationContext());
  }

  //Now in an non-activity

  public class Json {

    public void checkJsonFile(final String url, final Context context) {

        new Thread(new Runnable() {
            public void run() {
                String result;
                String line;

                try {

                    URL obj = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
                    conn.setReadTimeout(5000);
                    conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
                    conn.addRequestProperty("User-Agent", "Mozilla");
                    conn.addRequestProperty("Referer", "google.com");


                    boolean redirect = false;

                    // normally, 3xx is redirect
                    int status = conn.getResponseCode();
                    if (status != HttpURLConnection.HTTP_OK) {
                        if (status == HttpURLConnection.HTTP_MOVED_TEMP
                                || status == HttpURLConnection.HTTP_MOVED_PERM
                                || status == HttpURLConnection.HTTP_SEE_OTHER)
                            redirect = true;
                    }

                    if (redirect) {

                        // get redirect url from "location" header field
                        String newUrl = conn.getHeaderField("Location");

                        // get the cookie if need, for login
                        String cookies = conn.getHeaderField("Set-Cookie");

                        // open the new connnection again
                        conn = (HttpURLConnection) new URL(newUrl).openConnection();
                        conn.setRequestProperty("Cookie", cookies);
                        conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
                        conn.addRequestProperty("User-Agent", "Mozilla");
                        conn.addRequestProperty("Referer", "google.com");


                    }

                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(conn.getInputStream()));

                    StringBuilder sb = new StringBuilder();

                    while ((line = in.readLine()) != null) {
                        sb.append(line);

                    }
                    in.close();

                    result = sb.toString();

                    new Sign_Up().parseJSON(result);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}


        //Back in Sign_Up class

        public void parseJSON(String JSON){
        int error = -1;
        try {
                JSONObject jsonObject = new JSONObject(JSON);

                error = Integer.parseInt(jsonObject.getString("error_code"));

        } catch (JSONException e) {
            //Retry
            register();

            e.printStackTrace();
        }

        progressDialog.dismiss();

        switch (error) {
            case 0: //Successful
                finish();
                startActivity(new Intent(Sign_Up.this, Loading.class));
                break;
            case 1:
                Toast.makeText(getApplicationContext(), "blabla", Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(getApplicationContext(), "other blabla", Toast.LENGTH_SHORT).show();
                break;
            default:
                register();
                break;
        }
    }

但是,当我将Json内容放入Sign_Up类中时,至少startActivity有效,但Toast无效。同样,我想将Json的内容放在一个单独的类中。

非常感谢您!

1 个答案:

答案 0 :(得分:0)

您不能通过调用来创建活动

"scripts": {
    "ng": "ng",
    "start": "ng serve --base-href=/ --serve-path=/",
    "start:fr": "ng serve --base-href=/fr-FR/ --configuration=fr --serve-path=/fr-FR",
    "build": "ng build",
    ...
  },

,并期望任何东西都能正常工作。线

new MyActivity()

不正确地创建了new Sign_Up().parseJSON(result); 活动的新实例,因此它没有绑定到上下文,并且不会执行其生命周期调用。您无法在该状态下显示吐司。

更好的解决方案是将接口从Sign_Up传递到Sign_Up类,以使其回调到原始Json实例,而不是尝试创建新实例。例如:

Sign_Up

并创建它替换

class Json {
    public interface Callback {
        public void run(String result);    
    }

    private Callback callback

    Json(Callback c) {
        callback = c;
    }

    // later, replace new Sign_Up().parseJSON(result) with callback.run(result)
}

使用

new Json().checkJsonFile(url,getApplicationContext());

您还需要确保所有UI操作(吐司生成)都在UI线程上运行。