NullPointerException onPostExecute в Asynctask - PullRequest
0 голосов
/ 14 апреля 2019

Я добавил значок на панели инструментов меню, который при вращении в течение нескольких секунд выполняет код, который проверяет, доступны ли какие-либо обновления для приложения или нет, и затем анимация останавливается.Раньше все работало хорошо, но я не знаю, что с сегодняшнего утра оно проверяет обновления, но затем вместо остановки анимации происходит сбой приложения со значением ниже logcat.

 Process: com.nepalpolice.yummyfood, PID: 3400
java.lang.NullPointerException
    at com.nepalpolice.yummyfood.MainActivity.resetUpdating(MainActivity.java:248)
    at com.nepalpolice.yummyfood.update.UpdateTask.onPostExecute(UpdateTask.java:37)
    at com.nepalpolice.yummyfood.update.UpdateTask.onPostExecute(UpdateTask.java:12)

Ниже приведен метод resetUpdating из Mainactivity

   public void resetUpdating() {
    // Get our refresh item from the menu
    MenuItem m = mymenu.findItem(R.id.action_refresh);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (m.getActionView() != null) {
            // Remove the animation.
            m.getActionView().clearAnimation();
            m.setActionView(null);
        }
    }
}

Класс обновленной задачи

public class UpdateTask extends AsyncTask<Void, Void, Void> {
private Context mCon;

public UpdateTask(Context con)
{
    mCon = con;
}

@Override
protected Void doInBackground(Void... nope) {
    try {
        // Set a time to simulate a long update process.
        Thread.sleep(4000);

        return null;

    } catch (Exception e) {
        return null;
    }
}

@Override
protected void onPostExecute(Void nope) {

    ((MainActivity) mCon).resetUpdating();

       }
    }

Класс UpdateSErvice

    public class UpdateService extends Service {          
    public UpdateService() {
}

@Override
public int onStartCommand(Intent intent, int flags, int startId){

    RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
    String url = "http://updatesagar.blogspot.com/2018/06/msc.html";

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            if(response != null ) {
                boolean resp = response.contains("<div class='post-body entry-content' id='post-body-4386558807662471459' itemprop='description articleBody'>\n" +
                        "<div dir=\"ltr\" style=\"text-align: left;\" trbidi=\"on\">\n" +
                        "11</div>\n" +
                        "<div style='clear: both;'></div>");

                if (!resp) {
                    Intent intent1 = new Intent(UpdateService.this, UpdateDialog.class);
                    intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent1);

                } else {
                    Toast.makeText(getBaseContext(), "No updates Availaible", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }, new Response.ErrorListener(){
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            volleyError.printStackTrace();
        }
    });
    queue.add(stringRequest);
    return Service.START_NOT_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
      }
}

Дайте мне знать, если требуется дополнительная информация.Заранее спасибо.

1 Ответ

0 голосов
/ 14 апреля 2019

Мое предположение по номеру строки кода и ошибке, связанной с поворотом, таково: скорее всего, эта строка вызывает нулевой указатель

MenuItem m = mymenu.findItem(R.id.action_refresh);

mymenu равно нулю

при повороте экрана все виды пользовательского интерфейса воссоздаются, поэтому старый вид исчезает, если выполнение асинхронной задачи заняло некоторое время, а вращение происходит в середине обработки.правильный способ сделать это - после завершения задачи сначала найти последний объект текущего вида из mainactivity перед выполнением любого набора, действия и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...