2017-01-18 10 views
0

У меня есть приложение, которое имеет Asynctask для веб-запросов Api, и есть много запросов для многих вкладок.Результат Asynctask появляется после закрытия активности и приводит к сбою

Когда пользователь прокручивает очень быстро между вкладками, многие запросят обеды! но когда пользователь закрывает эту активность, некоторые из которых в фоновом режиме приводят к сбою приложений.

Я попытался это: в моем doinBackground я всегда проверяю, если фрагмент isAdded()

@Override 
protected Void doInBackground(Void... Params) { 
Bundle bundle = getArguments(); 
String url = ServiceHandler.serverEnum.serverRootPath + ServiceHandler.serverEnum.Me.toString(); 


if(isAdded()){ 
      response = StaticUtils.generateReguest(mContext, url, headerParams, bodyParams, URLParams, null, ServiceHandler.serviceMethod.get.toString()); 
     } 

    return null; 
} 

Я также сделать это, когда AsyncTask бежит от деятельности: OnStop деятельности я отменил RAN Asyctask то onPostExecute из него проверьте, не отменены ли некоторые элементы интерфейса. но проблема заключается в том, что я получаю сбой в doInBackground.

это линия, что авария происходит в создании реагировать StaticUtils.generateReguest:

if (status != 200 && status != 401 && status != 404 && status != 0) { 
      Intent intent = new Intent(context, ErrorActivity.class); //error point to this line 
      intent.putExtra(ErrorActivity.REASON, "SERVER"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      (context).startActivity(intent); 
     } 

и это журнал кошки, которые приводят к строке выше:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 

Я думаю, что это может из-за контекста. потому что, когда я сгенерирую запрос, я передаю контекст Activity в Requestgenerator и некоторое время, как вы видите в коде, это приводит к появлению ошибки. когда пользователь закрывает контекст активности, изменился так, чтобы генератор запросов не мог открыть `ErrorActivity. что лучше всего справиться с этим? Я googled и не мог найти хорошее решение?

+0

вы должны сделать то же самое в onPause активности. – Shuddh

+0

авария случается на делатьOnBackground! – Kenji

+0

Можете ли вы дать мне журналы – Shuddh

ответ

0

Я думаю, что контекст равен нулю. Почему нет нулевой проверки контекста.

 if(context != null){ 
      Intent intent = new Intent(context, ErrorActivity.class); 
      intent.putExtra(ErrorActivity.REASON, "SERVER"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      (context).startActivity(intent); 
     } 
0

Вашего context пустой, я не уверен, как вы передаете контекст. Но я рекомендовал бы этот путь,

public class YourActivity extends Application{ 
    Context appContext; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_two); 
     appContext=getApplicationContext(); 
MyAsynchClass mAsynch= new MyAsynchClass(appContext); 
mAsynch.execute(); 
    } 

И затем использовать это appContext из вашего конструктора.

Если выше не работает, то использовать это,

From this users answer,

<application android:name="com.xyz.MyApplication"> 

</application> 

public class MyApplication extends Application { 

    private static Context context; 

    public void onCreate() { 
     super.onCreate(); 
     MyApplication.context = getApplicationContext(); 
    } 

    public static Context getAppContext() { 
     return MyApplication.context; 
    } } 
+0

Я делаю что-то вроде этого. прочитайте вопрос еще раз. в середине изменений активности Asynctask – Kenji

0

1) Поместите точку отладчик в этом месте и проверьте, какая переменная становится нулевой. Похож на его контекст, который является нулевым, но все же проверяет его один раз.

2) Если это оленья кожа работа, использовать ту же самую функцию, т.е.

if (status != 200 && status != 401 && status != 404 && status != 0) { 
    Intent intent = new Intent(context, ErrorActivity.class); 
     intent.putExtra(ErrorActivity.REASON, "SERVER"); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 

в пост exceute. Я не уверен, но так как в фоновом режиме в фоновом потоке, а не в потоке пользовательского интерфейса, он не может обрабатывать процессы пользовательского интерфейса.