2014-09-25 5 views
0

У меня есть Android AsyncTask и onPostExecute() никогда не запускается.AsyncTask не вызывает onPostExecute()

Теперь я ЗНАЮ, что мой doInBackground() проходит, потому что я тестировал это.

Мои onPostExecute() это:

protected void onPostExecute() { 
    System.out.println("onPost"); 
    helper.close(); 
    System.out.println("worked"); 
    if (unitary && exists) { 
     adapter.notifyDataSetChanged(); 
     System.out.println("notified"); 
    } 
    } 

Ни один из печати линии не печатаются.

Должен ли я фактически использовать этот метод?

+0

Опубликуйте полный 'AsyncTask' вы Арен 't использование каких-либо 'params' в вашей декларации, но должно иметь * что-то * – codeMagic

+0

Где вы ожидаете, что System.out.println() будет печатать? –

+0

И нет, вам не нужно вызывать этот метод. –

ответ

2

Должен ли я фактически использовать этот метод?

Нет, но вы должны его правильно реализовать.

Начните с добавления аннотации @Override. Всегда делайте это, когда переопределяете метод (или реализуете метод, определенный на интерфейсе).

Затем вы получите ошибку компиляции, указав, что ваш метод фактически не отменяет ничего. Это связано с тем, что onPostExecute() всегда принимает параметр третьего типа в объявлении AsyncTask. Итак, если вы создаете AsyncTask<Foo, Bar, Baz>, onPostExecute() принимает параметр Baz.

Вот пример реализации фрагмента с использованием AsyncTask для имитации загрузки данных в фоновом режиме. Он использует Void как тип третьего данных в AsyncTask декларации (на ваш комментарий), и, следовательно, принимает Void в качестве параметра onPostExecute():

/*** 
    Copyright (c) 2008-2014 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
    http://commonsware.com/Android 
*/ 

package com.commonsware.android.async; 

import android.app.ListFragment; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Toast; 
import java.util.ArrayList; 

public class AsyncDemoFragment extends ListFragment { 
    private static final String[] items= { "lorem", "ipsum", "dolor", 
     "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", 
     "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", 
     "vel", "erat", "placerat", "ante", "porttitor", "sodales", 
     "pellentesque", "augue", "purus" }; 
    private ArrayList<String> model=null; 
    private ArrayAdapter<String> adapter=null; 
    private AddStringTask task=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setRetainInstance(true); 

    if (model == null) { 
     model=new ArrayList<String>(); 
     task=new AddStringTask(); 
     task.execute(); 
    } 

    adapter= 
     new ArrayAdapter<String>(getActivity(), 
           android.R.layout.simple_list_item_1, 
           model); 
    } 

    @Override 
    public void onViewCreated(View v, Bundle savedInstanceState) { 
    super.onViewCreated(v, savedInstanceState); 

    getListView().setScrollbarFadingEnabled(false); 
    setListAdapter(adapter); 
    } 

    @Override 
    public void onDestroy() { 
    if (task != null) { 
     task.cancel(false); 
    } 

    super.onDestroy(); 
    } 

    class AddStringTask extends AsyncTask<Void, String, Void> { 
    @Override 
    protected Void doInBackground(Void... unused) { 
     for (String item : items) { 
     if (isCancelled()) 
      break; 

     publishProgress(item); 
     SystemClock.sleep(400); 
     } 

     return(null); 
    } 

    @Override 
    protected void onProgressUpdate(String... item) { 
     if (!isCancelled()) { 
     adapter.add(item[0]); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
     if (!isCancelled()) { 
     Toast.makeText(getActivity(), R.string.done, Toast.LENGTH_SHORT) 
      .show(); 
     } 

     task=null; 
    } 
    } 
} 

(от this sample project)

+0

Я теперь это, но мой Баз - Пустота. могу ли я дать это как параметр? – newnewbie

+1

@newnewbie: Да. 'Void' - это форма объекта' void', um, и может быть параметром метода, так же как и тип возврата из метода 'doInBackground()'. См. [Этот образец проекта] (https://github.com/commonsguy/cw-omnibus/tree/master/Threads/AsyncTask), который использует 'Void' для третьего типа данных в объявлении' AsyncTask'. – CommonsWare

+0

Выключает, знает, Void производит компилятор Ошибка – newnewbie