Определение нового представления внутри Asynctask не определено - ANdroid
У меня есть Asynctask, который находится внутри задачи деятельности. Когда я пытаюсь создать новый вид внутри Asynctask, он выдает ошибку и говорит, что она не определена. Вот то, что мой код в основном.
public class DashboardActivity extends Activity {
class loadComments extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(String... params) {
LinearLayout commentBox = new LinearLayout(this);
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}// end asynctask
}//end activity
Ошибка возникает, когда я пытаюсь сделать linearLayout или любой тип представления. Я попытался убрать (это) утверждение и разместить код везде.
3 ответа
doInbackground
работает в фоновом потоке. Таким образом, вы не можете получить доступ / обновить пользовательский интерфейс из фонового потока. Вы можете обновить пользовательский интерфейс в потоке пользовательского интерфейса.
Msgstr "Только исходный поток, создавший иерархию представлений, может касаться его представлений."
Вы увидите вышеупомянутое сообщение, если вы обновите пользовательский интерфейс из фонового потока.
onPreExecute
а также onPostExecute
вызываются в потоке пользовательского интерфейса. Вы можете вернуть результат в doInBackground и обновить пользовательский интерфейс в onPostExecute. Результатом вычисления doInbackground является параметр onPostExecute.
Так как у вас было это
LinearLayout commentBox = new LinearLayout(this);
this
не относится к контексту активности в вашем случае. Даже если вы используете контекст активности и инициализируете линейный макет, вам нужно добавить его в корневой макет.
http://developer.android.com/reference/android/os/AsyncTask.html
public class DashboardActivity extends Activity {
LinearLayout layout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
layout = new LinearLayout(this);
setContentView(layout);
new loadComments().execute(params);
}
class loadComments extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(String... params) {
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
Не следует выполнять какие-либо операции пользовательского интерфейса в doInbackground AsyncTask, которое вне потока пользовательского интерфейса, doInBackground вызывает фоновый поток.
Вместо этого вы можете выполнить операцию пользовательского интерфейса в onProgressUpdate, onPostExecute и onPreExecute
Для получения дополнительной информации см. http://developer.android.com/reference/android/os/AsyncTask.html
Тебе этого не сделать.
LinearLayout commentBox = new LinearLayout(this);
Сделайте это в потоке пользовательского интерфейса, то есть переместите его за пределы doInBackground().