gpt4 book ai didi

android - 类(class)切换后 startActivity 不工作

转载 作者:行者123 更新时间:2023-11-29 02:27:09 25 4
gpt4 key购买 nike

我想在解析 JSON 响应后启动一个 Activity 并发出 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 的东西放在一个单独的类中。

非常感谢您!

最佳答案

您不能通过调用来创建 Activity

new MyActivity()

并期望一切正常。线路

new Sign_Up().parseJSON(result);

正在错误地创建 Sign_Up Activity 的新实例,因此它未绑定(bind)到上下文,并且不会执行其生命周期调用。您无法在该状态下显示 Toast。

更好的解决方案是将接口(interface)从 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());

new Json(new Json.Callback() {
@Override
public void run(String result) {
parseJSON(result);
}
}).checkJsonFile(url,getApplicationContext());

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

关于android - 类(class)切换后 startActivity 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51581381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com