我想开始一个活动并在解析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的内容放在一个单独的类中。
非常感谢您!
答案 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线程上运行。