2016-10-30 2 views
-2

В основном я использую AsyncTask показать progressBar, а после progress является 10, он должен работать метод, который находится в MainActivity. Когда progressBar равен 10/10, это приводит к сбою при следующей ошибке.onPostExecute не открывается Намерение

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

MapProgressTask

@Override 
protected void onPostExecute(String result) { 
    textView.setText(result); 
    button.setEnabled(true); 
    progressDialog.hide(); 
    MainActivity mainActivity = new MainActivity(); 
    mainActivity.getGooglePlace(); 
} 

MainActivity

protected void getGooglePlace() 
    { 
     PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); 
     Intent intent; 
     try { 
      intent = builder.build(MainActivity.this); 
      startActivityForResult(intent, place_picker_request); 
     } catch (GooglePlayServicesRepairableException e) { 
      e.printStackTrace(); 
     } catch (GooglePlayServicesNotAvailableException e) { 
      e.printStackTrace(); 
     } 
    } 

Можете ли вы сказать мне, как я могу запустить этот метод, когда progressBar полна пожалуйста? Благодаря!

+1

MainActivity mainActivity = new MainActivity() ;? Что ты пытаешься сделать? – Vardan95

+1

никогда не пытайтесь создать экземпляр своей деятельности для выполнения метода внутри этого действия. Создайте этот метод внутри публичного разделенного класса .... – Opiatefuchs

+0

** Никогда ** не создавайте экземпляр действия самостоятельно. Итак, во-первых, удалите эти строки: «MainActivity mainActivity = new MainActivity(); mainActivity.getGooglePlace(); '. Затем определите лучший план для запуска этого другого действия (например, 'static', используя' Context' в качестве параметра). Обязательно учитывайте возможность изменения конфигурации во время работы вашей программы AsyncTask (например, пользователь поворачивает экран). – CommonsWare

ответ

2

В вашем onPostExecute случае, вам необходимо добавить флаг перед началом деятельности, когда вы начинаете свою деятельность из класса неактивности:

protected void getGooglePlace() 
{ 
    PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); 
    Intent intent; 
    try { 
     intent = builder.build(MainActivity.this); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //Needed when starting an activity from a non-activity class 
     startActivityForResult(intent, place_picker_request); 
    } catch (GooglePlayServicesRepairableException e) { 
     e.printStackTrace(); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Я не думаю, что для этого случая требуется 'FLAG_ACTIVITY_NEW_TASK'. Это необходимо, как указывает ваш комментарий, когда действие начинается с неинформационного «Контекста», и у нас нет доказательств того, что это так. – CommonsWare

0

В моей точки зрения, нет необходимости для создания вашей активности. Это плохое решение. Вы можете поместить свою задачу async в качестве вложенного класса в свою активность и вызвать метод getGooglePlace(), но это также плохая идея. Я бы предложил следующий подход.

public class MyTask extends AsyncTask<Void, Void, Void> { 
    private WeekReference<MyListener> mListener; 

    public MyTask(MyListener listener) { 
     mListener= new WeakReference<MyListener>(listener); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     MyListener activity = mListener.get(); 
     if (activity != null) { 
     // do your stuff with activity here 
     } 
    } 
    } 
Смежные вопросы