我正在开发一个Android应用程序,我的问题是我在单击按钮后无法执行我的asyntask类但是当我在程序中调用它时它正常工作 我在logcat中遇到错误:“只有创建视图层次结构的原始线程才能触及其视图。” 这是我的班级:
ts.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
jr=2;
emp trs=new emp();
trs.execute();
}
});
emp t=new emp();
t.execute();
private class emp extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... params) {
try{
url = new URL("....");
HttpURLConnection httpconn = (HttpURLConnection)url.openConnection();
httpconn.connect();
if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK){
BufferedReader input = new BufferedReader(new InputStreamReader(httpconn.getInputStream()),8192);
while ((line = input.readLine()) != null) {
ja = new JSONArray(line);}
for (int i = 0; i < ja.length(); i++) {
JSONObject jo = null;j=0;
jo = (JSONObject) ja.getJSONObject(i);
ch = jo.getString("bgcolor");
ch1=jo.getString("duree_heure");
ch2=jo.getString("debut_heure");
ch4=jo.getString("matiere");
j=Integer.parseInt(ch2);
ch2=trans(j,ch1);
ch5=jo.getString("idsalle");
ch6=salle(ch5);
addvi(v,ch,ch6,ch2,ch4);
}
input.close();
}
}catch (JSONException e){
System.out.print("vérifier !");e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
return null;
}
}
所以有人可以帮助我吗?
答案 0 :(得分:0)
这是因为当你在doInBackground
内时,你也在另一个线程内,因为禁止编辑/删除/ etc视图从另一个线程创建(在这种情况下是UI线程)它会抛出此错误
由于你没有发布完整的代码,唯一可以解决这个问题的是addvi(v,ch,ch6,ch2,ch4);
所以你应该使用Activity的runOnUiThread
方法从主线程执行方法。
但应该重新思考您的逻辑,以便更好地使用Asynctask方法onPreExecute
/ onPostExecute
,它用于处理UI并在主线程中调用和执行( UI线程)。
P.S为了更好地使用上面提到的方法,您应该知道extends
AsyncTask
<Params, Progress, Result>
异步任务使用的三种类型如下:
参数,执行时发送给任务的参数类型。
进度,后台计算期间发布的进度单元的类型。
结果,后台计算结果的类型。
修改:正如其他人在评论中注意到的那样,您onProgressUpdate
使用doBackground
publishProgress
方法调用了{{3}}
答案 1 :(得分:0)
你无法在asynctask的doInBackground函数中触摸或修改视图所有UI工作都需要在UI线程或主线程上完成。我认为你正在做一些UI工作,所以在onPostExecute()方法中这样做