2013-10-13 2 views
-1

Вот мой кодПроизошла ошибка во время выполнения doInBackground?

package com.example.rollsystems; 

import java.util.ArrayList; 
import org.dto.Student; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.app.Activity; 
import android.content.Context; 
import com.example.listview.*; 

import com.example.Utils.AllBO; 
import com.example.rollsystems.R; 

public class RollCallActivity extends Activity { 

    ArrayList<Student> array; 
    ListStudentAdapter arrayAdapter; 
    ListView list; 

    TextView txtClassAt; 
    TextView txtSubjectAt; 
    TextView txtInstructorAt; 
    TextView txtTimeAt; 
    TextView txtDateAt; 
    Context context; 

    public class RollCallTask extends AsyncTask<Void, Void, Void> { 

     public RollCallActivity activity; 

     public RollCallTask(RollCallActivity a) 
     { 
      activity = a; 
     } 
     @Override 
     protected Void doInBackground(Void... params) { 
      //SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("rs", Context.MODE_PRIVATE); 
      //String RollCallID = sharedPref.getString("RollCallID", "14"); 

       String RollCallID = "14"; 
       list = (ListView)findViewById(R.id.listAtStudent); 
       ArrayList<Student> rollCalls = new AllBO().getRollCallInfo(RollCallID); 
       array = rollCalls; 

      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      arrayAdapter = new ListStudentAdapter(activity, R.layout.list_atstudent, array); 
      list.setAdapter(arrayAdapter); 
      txtClassAt = (TextView) findViewById(R.id.txtClassAt); 
     } 

    } 

    /** Called when the activity is first created. */ 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.tab_rollcall); 

      new RollCallTask(this).execute(); 
      txtClassAt = (TextView) findViewById(R.id.txtClassAt); 

     } 


} 

А потом, когда я бегу:

E/AndroidRuntime(883): FATAL EXCEPTION: AsyncTask #1 
E/AndroidRuntime(883): java.lang.RuntimeException: An error occured while executing 
doInBackground() 
E/AndroidRuntime(883): at android.os.AsyncTask$3.done(AsyncTask.java:278) 

каждую помощь драгоценна

+1

Не могли бы вы опубликовать весь LogCat, поэтому мы можем видеть точную ошибку –

+1

Поставьте точку останова на ваш метод doInBackground и шаг за шагом через него найдите ошибку. – Kuffs

ответ

0

Вы пытаетесь получить доступ к UI от фонового потока. Вам нужно сделать это за пределами doInBackground.

Вы также должны позвонить по номеру AsyncTask из пользовательского интерфейса. Несоблюдение этого является причиной ошибки во время выполнения.

public class RollCallTask extends AsyncTask<Void, Void, Void> { 

    public RollCallActivity activity; 

    public RollCallTask(RollCallActivity a) 
    { 
     activity = a; 
    }   

    @Override 
    protected Void doInBackground(Void... params) { 
     //SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("rs", Context.MODE_PRIVATE); 
     //String RollCallID = sharedPref.getString("RollCallID", "14"); 

     String RollCallID = "14"; 
     ArrayList<Student> rollCalls = new AllBO().getRollCallInfo(RollCallID); 
     array = rollCalls; 

     return null; 
    } 
} 

И тогда ваш onCreate будет

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tab_rollcall); 

     list = (ListView)findViewById(R.id.listAtStudent); 
     txtClassAt = (TextView) findViewById(R.id.txtClassAt); 
     new RollCallTask(this).execute(); 

    } 
+0

не работает :( –

+0

Ну ладно, я вижу это сейчас. Вы вызываете другую 'asynctask' из' doInBackground'. Asynctasks * необходимо * вызывать из потока пользовательского интерфейса, иначе они будут вызывать 'RuntimeException', что вы здесь. – Jon

0

Задача асинхронной получает доступ к UI. Не делайте findViewById в нем, используйте onCreate из Activity/Fragment.

Здесь также несколько вопросов конвенции:

String RollCallID = "14"; 
list = (ListView)findViewById(R.id.listAtStudent); 
ArrayList<Student> rollCalls = new AllBO().getRollCallInfo(RollCallID); 
array = rollCalls; 
  • переменные никогда не должны начинаться с заглавной буквы rollCallID

  • XML идентификаторы не должны быть верблюд обсаженных R.id.list_as_student

  • массив не используется вне адаптера, зачем использовать переменную за ее пределами?
0

Используйте объект Handler из вашего MainActivity и опубликуйте runnable. Чтобы использовать его из backgrund, вам нужно сделать объект статичным, который вы можете вызывать за пределами своей MainActivity, или создать статический экземпляр Activity для доступа к нему.

Внутри активность

private static Handler handler; 


handler = new Handler(); 

handler().post(new Runnable() { 

    public void run() { 
     //ui stuff here :) 
    } 
}); 

public static Handler getHandler() { 
    return handler; 
} 

Вне деятельности

MainActivity.getHandler().post(new Runnable() { 

     public void run() { 
      //ui stuff here :) 
     } 
    }); 
Смежные вопросы