Aju*_*Aju 2 android android-asynctask
我打电话一webservice通asynctask,打电话给webservice我打电话的一种方法命名makeRequest()中doInBackground(),我得到另一种方法的响应success(),在成功的方法,我更新listview
但我得到的错误就像
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."
Run Code Online (Sandbox Code Playgroud)
我在这里添加我的代码.我synctask从活动中调用
new MyTask(this,urlAsString,sp).execute();
Run Code Online (Sandbox Code Playgroud)
这是Asynctask类
class MyTask extends AsyncTask<Void, Void, Void> {
ProgressDialog progress;
String url;
SharedPreferences sp;
HomepageH2desk c;
public MyTask(HomepageH2desk context,String url,SharedPreferences sp) {
this.c = context;
this.url = url;
this.sp = sp;
progress = new ProgressDialog(this.c);
progress.setMessage("Loading...");
}
public void onPreExecute() {
progress.show();
}
public Void doInBackground(Void... unused) {
c.getTickets(url,sp);
return null;
//progress.setMessage("Loading...");
}
public void onPostExecute(Void unused) {
progress.dismiss();
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里得到webservice回应
public void success(Object result) {
list = (ArrayList<Map<String, String>>) result;
this.adapter.setList(list);
this.adapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
listview 没有得到更新并显示错误
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Run Code Online (Sandbox Code Playgroud)
帮我解决这个问题......
Lal*_*ani 19
您应该像这样更新您的列表.
Activity_name.this.runOnUiThread(new Runnable() {
@Override
public void run() {
list = (ArrayList<Map<String, String>>) result;
this.adapter.setList(list);
this.adapter.notifyDataSetChanged();
}
});
Run Code Online (Sandbox Code Playgroud)
因为这是你在另一个线程中执行一些MainThread任务时出现的错误.....
试试这个:
runOnUiThread(new Runnable(){
public void run(){
this.adapter.setList(list);
this.adapter.notifyDataSetChanged();
}
});
Run Code Online (Sandbox Code Playgroud)
此代码可能有一些错误但是在简单的单词中..将notifyDataSetChanged调用添加到runOnUiThread()方法中.你将完成..
或者这也可以是DOne(完美的方式)
在您的活动类中添加以下内容
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
this.adapter.setList(list);
adapter.setnotifyDataSetChanged();
}
};
Run Code Online (Sandbox Code Playgroud)
如下所示,在您想要调用notifydatasetchanged的时间和地点调用此处理程序
handler.sendEmptyMessage(0);
Run Code Online (Sandbox Code Playgroud)
谢谢sHaH
| 归档时间: |
|
| 查看次数: |
16168 次 |
| 最近记录: |