Android : 如何减慢我的应用程序
Android : How do I slow down my application
我将我的 ProfileActivity 设置为扩展到实现 View.OnClickListener 的 AppCompatActivity。单击分配的按钮时,它会使用 Volley 将 StringRequest 发送到 url,获取 JSON 格式并对其进行解析,然后将其存储在另一个 class 中。在 myTabActivity 上启动的下一个 activity 需要存储的数据。在启动 myTabActivity 之前,我需要让 ProfileActivity 等到请求、解析和存储在 ParseWorkOrderJSON.java 中完成。有什么想法吗?
我也是 Android 的新手。
以下是我的代码片段:
public class ProfileActivity extends AppCompatActivity implements View.OnClickListener {
public static final String JSON_URL = "/*I ommitted my URL on purpose here*/";
private TextView username_txt;
private Button fetch_data_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
username_txt = (TextView)findViewById(R.id.txt_username);
fetch_data_btn = (Button)findViewById(R.id.btn_fetch_data);
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
String username = sharedPreferences.getString(Config.USERNAME_SHARED_PREF,"Not Available");
username_txt.setText(username);
sendRequest();
fetch_data_btn.setOnClickListener(this);
}
private void sendRequest(){
final ProgressDialog loading = ProgressDialog.show(this,"Fetching data.","Please wait...", false,false);
StringRequest stringRequest = new StringRequest(Request.Method.GET,JSON_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
System.out.println(response.substring(0));
showJSON(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("Something went wrong!");
Toast.makeText(ProfileActivity.this, "Something went wrong!", Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
private void showJSON(String json){
ParseWorkOrderJSON pwoj = new ParseWorkOrderJSON();
pwoj.parseWorkOrderJSON(json);
}
@Override
public void onClick(View v){
sendRequest();
Intent intent = new Intent(ProfileActivity.this, MytabActivity.class);
startActivity(intent);
}
}
我正在尝试在请求、解析和存储过程中使用 ProgressDialog,然后在完成所有操作后关闭它。然后才加载下一个 activity,即 myTabActivity。
如果您想要 ParseWorkOrderJSON 的片段,请在评论中说明。
您不需要降低您的应用程序的速度。您只需要更好地了解异步操作的实际运作方式。
某些操作(如 HTTP 请求)可能需要很长时间。如果您在主应用程序线程(即负责更新和绘制 UI 的线程)上执行它们,您的用户可能会遇到冻结 UI、无响应行为和所有其他栏内容。事实上,Android 有一个内置机制来防止这种情况,如果应用程序处理用户输入的时间太长,它会尝试强制关闭它(可怕的 ANR 对话框)。
处理这个问题的方法是从主线程中卸载那些繁重的操作。然后你有另一个问题 - 你需要知道操作何时完成并做出相应的反应。这称为异步操作 - 它开始并 returns 在未来的某个时刻产生结果。
您正在使用 Volley - 一个库,它为您完成所有这些工作 - 它创建一个工作线程并使用它来执行 HTTP 请求,为您提供回调以在请求完成时得到通知。
问题是您在启动 Volley 请求时启动了 activity。此时仍然没有加载数据,也不会显示任何内容。您应该等待请求完成,然后再继续。如何知道请求何时完成 - 即 onResponse()
方法被调用的时间。为了让一切正常,你应该移动你的代码以在那里开始你的第二个 activity 。这样您就可以确定数据已经加载,您可以继续将其显示给用户。
我将我的 ProfileActivity 设置为扩展到实现 View.OnClickListener 的 AppCompatActivity。单击分配的按钮时,它会使用 Volley 将 StringRequest 发送到 url,获取 JSON 格式并对其进行解析,然后将其存储在另一个 class 中。在 myTabActivity 上启动的下一个 activity 需要存储的数据。在启动 myTabActivity 之前,我需要让 ProfileActivity 等到请求、解析和存储在 ParseWorkOrderJSON.java 中完成。有什么想法吗? 我也是 Android 的新手。
以下是我的代码片段:
public class ProfileActivity extends AppCompatActivity implements View.OnClickListener {
public static final String JSON_URL = "/*I ommitted my URL on purpose here*/";
private TextView username_txt;
private Button fetch_data_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
username_txt = (TextView)findViewById(R.id.txt_username);
fetch_data_btn = (Button)findViewById(R.id.btn_fetch_data);
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
String username = sharedPreferences.getString(Config.USERNAME_SHARED_PREF,"Not Available");
username_txt.setText(username);
sendRequest();
fetch_data_btn.setOnClickListener(this);
}
private void sendRequest(){
final ProgressDialog loading = ProgressDialog.show(this,"Fetching data.","Please wait...", false,false);
StringRequest stringRequest = new StringRequest(Request.Method.GET,JSON_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
System.out.println(response.substring(0));
showJSON(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("Something went wrong!");
Toast.makeText(ProfileActivity.this, "Something went wrong!", Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
private void showJSON(String json){
ParseWorkOrderJSON pwoj = new ParseWorkOrderJSON();
pwoj.parseWorkOrderJSON(json);
}
@Override
public void onClick(View v){
sendRequest();
Intent intent = new Intent(ProfileActivity.this, MytabActivity.class);
startActivity(intent);
}
}
我正在尝试在请求、解析和存储过程中使用 ProgressDialog,然后在完成所有操作后关闭它。然后才加载下一个 activity,即 myTabActivity。 如果您想要 ParseWorkOrderJSON 的片段,请在评论中说明。
您不需要降低您的应用程序的速度。您只需要更好地了解异步操作的实际运作方式。
某些操作(如 HTTP 请求)可能需要很长时间。如果您在主应用程序线程(即负责更新和绘制 UI 的线程)上执行它们,您的用户可能会遇到冻结 UI、无响应行为和所有其他栏内容。事实上,Android 有一个内置机制来防止这种情况,如果应用程序处理用户输入的时间太长,它会尝试强制关闭它(可怕的 ANR 对话框)。
处理这个问题的方法是从主线程中卸载那些繁重的操作。然后你有另一个问题 - 你需要知道操作何时完成并做出相应的反应。这称为异步操作 - 它开始并 returns 在未来的某个时刻产生结果。
您正在使用 Volley - 一个库,它为您完成所有这些工作 - 它创建一个工作线程并使用它来执行 HTTP 请求,为您提供回调以在请求完成时得到通知。
问题是您在启动 Volley 请求时启动了 activity。此时仍然没有加载数据,也不会显示任何内容。您应该等待请求完成,然后再继续。如何知道请求何时完成 - 即 onResponse()
方法被调用的时间。为了让一切正常,你应该移动你的代码以在那里开始你的第二个 activity 。这样您就可以确定数据已经加载,您可以继续将其显示给用户。