从Android 4.0开始我遇到了问题(在2.3.6上它正在运行)。
onProgressUpdate
它应该已经在UI线程中。
我已经尝试activity.runOnUiThread
现在使用Handler
版本,ofc首先没有任何版本。怎么解决?
public class ReadDataTask extends AsyncTask<String, String, JSONArray> {
private Activity activity;
protected ProgressDialog dlg;
private long startRead, endRead, endJson;
public ReadDataTask(Activity activity) {
this.activity = activity;
dlg = new ProgressDialog(activity);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dlg.show();
startRead = System.currentTimeMillis();
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
if (values != null && values.length > 0) {
final String msg = values[0];
new Handler().post(new Runnable() {
public void run() {
dlg.setMessage(msg);// android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
}
});
}
}
@Override
protected JSONArray doInBackground(String... params) {
... long task here
publishProgress("Converting to JSON: " + (1 + i) + " / " + dataList.size());
答案 0 :(得分:3)
仅在onPreExecute()
中创建一个处理程序,它从UI线程调用并保存对它的引用,而不是在onProgressUpdate()
中发布到它。
处理程序发布已创建的线程。
答案 1 :(得分:0)
谢谢大家! 解决方案的实施:
private Activity activity;
protected ProgressDialog dlg;
private Handler myHandler;
private long startRead, endRead, endJson;
public ReadDataTask(Activity activity) {
this.activity = activity;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
myHandler = new Handler();
dlg = new ProgressDialog(activity);
dlg.show();
startRead = System.currentTimeMillis();
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
if (values != null && values.length > 0) {
final String msg = values[0];
myHandler.post(new Runnable() {
public void run() {
dlg.setMessage(msg);
}
});
}
}
答案 2 :(得分:0)
以下对我有用。
myHandler.post(new Runnable() {
public void run() {
dlg.setMessage(msg);
}
});