Tôi đang phát triển một ứng dụng Android trong đó tôi sử dụng AsyncTask để nhận thông tin từ một dịch vụ Web bằng JSON, sau đó được tải trong một ListView. Cho đến đây, mọi thứ đều hoạt động tốt.ProgressDialog hoặc ProgressBar làm chậm ứng dụng chạy Android 4.1
Tôi đã sử dụng ProgressDialog được khởi tạo trong phương thức onPreExecute() và được loại bỏ trong phương thức onPostExecute(). Trong trình giả lập chạy phiên bản android 2.3.3, tất cả hành động này mất đến 7/8 giây. Tôi đã thử nghiệm với một thiết bị thực chạy 2.3.6 và ứng dụng có hành vi tương tự.
Tuy nhiên, khi tôi sử dụng trình giả lập chạy phiên bản Android 4.1, hành động này mất từ 65 đến 70 giây. Khi tôi loại bỏ ProgressDialog, hành động mất 7/8 giây trong cả hai phiên bản Android 2.3 và 4.1. Tôi đã thử nghiệm tất cả các kịch bản này nhiều lần.
Tại sao điều này lại xảy ra? Tôi không có bất kỳ thiết bị thực sự với phiên bản Android 4,1 để kiểm tra nó vì vậy tôi tự hỏi nếu đây là một vấn đề giả lập? Tôi đã cố gắng sử dụng một vòng tròn thanh tiến trình bình thường, thay vì ProgressDialog, nhưng điều tương tự cũng xảy ra, nó chỉ mất quá lâu trong phiên bản Android 4.1.
Bất kỳ ý tưởng nào có thể là lý do cho hành vi kỳ lạ này? : S
Cảm ơn bạn.
dmon và James McCracken đây là mã từ hoạt động của tôi, bạn có thể giúp tôi về điều này không?
public class MainActivity extends Activity {
private TextView tvTitleList;
private ListView lvDataSearch;
private ProgressDialog dialog;
private long timeStart;
private String[] dataSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvTitleList = (TextView) findViewById(R.id.tvTitleList);
lvDataSearch = (ListView) findViewById(R.id.lvDataSearch);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public class ProcessUpdateList extends AsyncTask<Integer, String, String[]> {
@Override
protected void onPreExecute() {
timeStart = System.currentTimeMillis();
System.out.println("pre execute");
try {
tvTitleList.setText("working....");
dialog = ProgressDialog.show(MainActivity.this, "", "Loading. Please wait...", true);
} catch (Exception e) {
System.out.println("Error Async 1: " + e.getMessage());
}
}
@Override
protected String[] doInBackground(Integer... paramss) {
try {
System.out.println("Get Data");
dataSearch = getDataSearch();
} catch (Exception e) {
System.out.println("Error Async 2: " + e.getMessage());
}
System.out.println("Return Data "
+ ((System.currentTimeMillis() - timeStart)/1000));
return dataSearch;
}
@Override
protected void onPostExecute(String[] values) {
try {
System.out.println("Post Execute Data");
tvTitleList.setText("done in " + ((System.currentTimeMillis() - timeStart)/1000));
updateViewList();
dialog.dismiss();
} catch (Exception e) {
System.out.println("Error Async 3: " + e.getMessage());
}
}
}
public void eventUpdateList() {
ProcessUpdateList process = new ProcessUpdateList();
try {
process.execute();
} catch (Exception e) {
System.out.println("NEW ERROR 2: " + e.getMessage());
}
}
public String[] getDataSearch() {
try {
String readTwitterFeed = readJSON2("http://search.twitter.com/search.json?q=hey");
JSONObject jsonObject = new JSONObject(readTwitterFeed);
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(jsonObject);
JSONObject jsonObject2 = new JSONObject(json);
JSONObject level1 = jsonObject2.getJSONObject("nameValuePairs");
JSONObject level2 = level1.getJSONObject("results");
JSONArray level3 = level2.getJSONArray("values");
dataSearch = new String[level3.length()];
System.out.println(level3.length()+" resultados encontrados.");;
for(int i=0; i<level3.length(); i++) {
dataSearch[i] = level3.getJSONObject(i).getJSONObject("nameValuePairs").getString("text");
}
}
catch(JSONException e) {
System.out.println(e.getMessage());
}
return dataSearch;
}
public String readJSON2(String command) {
JSONObject jObj = null;
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(command);
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
reader.close();
jObj = new JSONObject(builder.toString());
} else {
System.out.println(MainActivity.class.toString() + " Failed to download file");
}
} catch (Exception e) {
return null;
}
return builder.toString();
}
public void updateViewList() {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, dataSearch);
lvDataSearch.setAdapter(adapter);
}
public void clickBRefreshList(View v) {
eventUpdateList();
}
}
Tôi không thể nghĩ ra một lý do nào điều này sẽ xảy ra. Bạn có thể đăng nhật ký không? –
Cá gì đó ở đây, cho thấy bất kỳ khung cảnh nào cũng không mất thời gian. Nó cũng không rõ ràng nếu bạn có nghĩa là 0.875 giây hoặc "7 hoặc 8" giây. Nếu bạn có nghĩa là 7-8, sau đó một cái gì đó là chắc chắn sai. Bạn nên đăng mã cho AsyncTask của mình. – dmon