В первый раз, если я запускаю свое приложение, тогда элемент управления переходит к onPostExecute () после завершения doinBackground (). Но если я запустил приложение на устройстве без удаления, то onPostExecute () никогда не будет выполняться.
У меня есть активность, из которой я звоню в asynTask.
КОД:
public class AddThing extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { e.printStackTrace(); } private View.OnClickListener onSave = new View.OnClickListener() { startAddThingType2Task(); } } private class ThingCallback implements ActionCallback { Context cntxt; public ThingCallback(Context context) { // TODO Auto-generated constructor stub this.cntxt = context; } public void onSuccess(ArrayList<?> objects) { setProgressBarIndeterminate(false); Intent intent = new Intent(getApplicationContext(),DocketDetail.class); startActivityForResult(intent, 1); } public void onFailure(Exception exception) { Toast.makeText(cntxt, "Unable to add docket. Error is: "+ exception.getMessage(), Toast.LENGTH_LONG).show(); } } private void startAddThingType2Task() { final AddThingType2 task = new AddThingType2(AddThing.this,new ThingCallback(this)); runOnUiThread(new Runnable() { public void run() { // TODO Auto-generated method stub task.execute(); } }); }
Мой класс asyncTask:
public class AddThingType2Task2 extends AsyncTask<Void, Void, Boolean> { public ActionCallback callback = null; private Context context; private Exception ePriv = null; private Activity activity; public AddThingType2(Activity activity,ActionCallback callback, ) { this.callback = callback; this.context = context; this.activity = activity; } @Override protected void onPostExecute(Boolean result) { // TODO Auto-generated method stub super.onPostExecute(result); if (result == true) { callback.onSuccess(null); } else { callback.onFailure(ePriv); } } @Override protected Boolean doInBackground(Void... params) { // TODO Auto-generated method stub Boolean retval = false; try { retval = true; } } catch (Exception e) { Log.e("AddThingType2Task", e.getMessage()); ePriv = e; } return retval; } }
Интерфейс onSuccess()
имеет два метода – onSuccess()
и OnFailure()
.
Редактировать Я использую commonsware службы бодрствования в моем приложении.
Впервые его работая как шарм, но при повторном запуске onpostExecute () не работает …
Пожалуйста помоги !!
С уважением
После повторного запуска я получаю это в logcat :
09-20 17:37:28.515: W/MessageQueue(9311): Handler{4060df08} sending message to a Handler on a dead thread 09-20 17:37:28.515: W/MessageQueue(9311): java.lang.RuntimeException: Handler{4060df08} sending message to a Handler on a dead thread 09-20 17:37:28.515: W/MessageQueue(9311): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:196) 09-20 17:37:28.515: W/MessageQueue(9311): at android.os.Handler.sendMessageAtTime(Handler.java:457) 09-20 17:37:28.515: W/MessageQueue(9311): at android.os.Handler.sendMessageDelayed(Handler.java:430) 09-20 17:37:28.515: W/MessageQueue(9311): at android.os.Handler.sendMessage(Handler.java:367) 09-20 17:37:28.515: W/MessageQueue(9311): at android.location.LocationManager$ListenerTransport.onStatusChanged(LocationManager.java:206) 09-20 17:37:28.515: W/MessageQueue(9311): at android.location.ILocationListener$Stub.onTransact(ILocationListener.java:75) 09-20 17:37:28.515: W/MessageQueue(9311): at android.os.Binder.execTransact(Binder.java:320) 09-20 17:37:28.515: W/MessageQueue(9311): at dalvik.system.NativeStart.run(Native Method)
public class AddThing extends Activity { private ThingCallback callback; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ThingCallback = new ThingCallback(this); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { e.printStackTrace(); } private View.OnClickListener onSave = new View.OnClickListener() { startAddThingType2Task(); } } private class ThingCallback implements ActionCallback { Context cntxt; public ThingCallback(Context context) { this.cntxt = context; } public void onSuccess(ArrayList<?> objects) { setProgressBarIndeterminate(false); Intent intent = new Intent(getApplicationContext(),DocketDetail.class); startActivityForResult(intent, 1); } public void onFailure(Exception exception) { Toast.makeText(cntxt, "Unable to add docket. Error is: "+ exception.getMessage(), Toast.LENGTH_LONG).show(); } } private void startAddThingType2Task() { final AddThingType2 task = new AddThingType2(AddThing.this, callback); task.execute(); }
Используете ли вы какой-либо другой Thread, а затем AsyncTask? Если нет, то нет необходимости использовать runOnUiThread. Удалите его и не сделайте ссылку ссылки AsyncTask окончательной. AsyncTask никогда не может выполняться дважды, поэтому вы должны создавать его каждый раз, когда используете его снова. Конечное ключевое слово предотвратит создание нового экземпляра и сделает ссылку неизменной.
private void startAddThingType2Task() { AddThingType2 task = new AddThingType2(AddThing.this,new ThingCallback(this)); task.execute(); }
Если вам нужен runOnUiThread, попробуйте объявить экземпляр AsyncTask в качестве поля. Таким образом, вы не должны делать это окончательным, чтобы использовать его в runOnUiThread.
Редактировать:
У вас будет что-то вроде этого:
public class AddThing extends Activity { // Your field AddThingType2 task; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { e.printStackTrace(); } private View.OnClickListener onSave = new View.OnClickListener() { startAddThingType2Task(); } private void startAddThingType2Task() { // no final needed and you can instantiate it multiple times task = new AddThingType2(AddThing.this, callback); task.execute(); } }
Поместите эту загрузку класса в приложение onCreate
public class MyApplication extends android.app.Application{ public void onCreate(){ try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }