类Asyntask错误

时间:2014-04-07 14:33:51

标签: android

我正在开发一个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;
    }
}

所以有人可以帮助我吗?

2 个答案:

答案 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()方法中这样做

相关问题