используя AsyncTask, но не может обновить представление с помощью метода onPostExecute - PullRequest
0 голосов
/ 27 декабря 2011

Я использую AsyncTask на одном из моих классов, но не могу обновить представление с помощью метода onPostExecute.В основном классе я использую ActionBar, меняя вкладки на вкладку результатов.где результаты запроса будут отображаться в виде списка.Я использую сервис restful и успешно получаю список обратно с сервера.Я пытаюсь обновить вкладку результатов (находится в основном классе), чтобы показать результаты запроса.пока не удалось, любая помощь будет принята с благодарностью, спасибо.

PS.Я получаю метод onPostExecute, запущенный после перехода на вкладку результатов и получения списка с сервера, но я не могу обновить представление в main из класса AsyncTask.Я также должен упомянуть, что у меня также есть метод onProgressUpdate «Я просто вывожу строку в журнал cat, чтобы убедиться, что она вызывается».а также метод doInBackground все работает нормально, но не может корректно обновить представление.Кроме того, так как я обновляю main из другого класса, я сделал статический просмотр списка и адаптер, чтобы я мог вызывать их из класса asyncTask. По-моему, это имеет смысл, но в этом может быть моя ошибка, вы можете видеть, чтона методе onPostExecute.спасибо.

метод OnCreate основного класса:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


       bar = getActionBar();
       bar.addTab(bar.newTab().setText("Basic\nSearch").setTabListener(this));
       bar.addTab(bar.newTab().setText("Advanced\nSearch").setTabListener(this));
       bar.addTab(bar.newTab().setText("Results").setTabListener(this));
       //bar.addTab(bar.newTab().setText("Exit").setTabListener(this));

       bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_USE_LOGO);
       bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
       bar.setDisplayShowHomeEnabled(true);
       // remove the activity title to make space for tabs
       bar.setDisplayShowTitleEnabled(false);
       bar.setDisplayUseLogoEnabled(false);
    }

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

public void basicSubmitButton(View view) throws InterruptedException {
        String query = myBasicEditText.getText().toString();
        bar.setSelectedNavigationItem(2);
        ReadWebpageAsyncTask basicSubmission = new ReadWebpageAsyncTask();
        basicSubmission.query(query);
    }

метод asyncTask Oncreate:

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.results);

    }

Метод onPostExecute:

protected void onPostExecute(String result) {
             Hummedia.myListView = (ListView) findViewById (R.id.lv);
             Hummedia.myListView.setTextFilterEnabled(true);
             Hummedia.myListView.clearChoices();

                Hummedia.adapter = new ArrayAdapter<String>(ReadWebpageAsyncTask.this,
                        android.R.layout.simple_list_item_1,
                        mediaList);
                //wait();
                Hummedia.myListView.setAdapter(Hummedia.adapter);
         }

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

12-26 18:21:48.916: D/AndroidRuntime(536): Shutting down VM
12-26 18:21:48.916: W/dalvikvm(536): threadid=1: thread exiting with uncaught exception (group=0x409951f8)
12-26 18:21:49.067: E/AndroidRuntime(536): FATAL EXCEPTION: main
12-26 18:21:49.067: E/AndroidRuntime(536): java.lang.NullPointerException
12-26 18:21:49.067: E/AndroidRuntime(536):  at android.app.Activity.findViewById(Activity.java:1794)
12-26 18:21:49.067: E/AndroidRuntime(536):  at edu.byu.hummedia.ReadWebpageAsyncTask$DownloadWebPageTask.onPostExecute(ReadWebpageAsyncTask.java:132)
12-26 18:21:49.067: E/AndroidRuntime(536):  at edu.byu.hummedia.ReadWebpageAsyncTask$DownloadWebPageTask.onPostExecute(ReadWebpageAsyncTask.java:1)
12-26 18:21:49.067: E/AndroidRuntime(536):  at android.os.AsyncTask.finish(AsyncTask.java:602)
12-26 18:21:49.067: E/AndroidRuntime(536):  at android.os.AsyncTask.access$600(AsyncTask.java:156)
12-26 18:21:49.067: E/AndroidRuntime(536):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
12-26 18:21:49.067: E/AndroidRuntime(536):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-26 18:21:49.067: E/AndroidRuntime(536):  at android.os.Looper.loop(Looper.java:137)
12-26 18:21:49.067: E/AndroidRuntime(536):  at android.app.ActivityThread.main(ActivityThread.java:4340)
12-26 18:21:49.067: E/AndroidRuntime(536):  at java.lang.reflect.Method.invokeNative(Native Method)
12-26 18:21:49.067: E/AndroidRuntime(536):  at java.lang.reflect.Method.invoke(Method.java:511)
12-26 18:21:49.067: E/AndroidRuntime(536):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-26 18:21:49.067: E/AndroidRuntime(536):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-26 18:21:49.067: E/AndroidRuntime(536):  at dalvik.system.NativeStart.main(Native Method)

1 Ответ

0 голосов
/ 27 декабря 2011

Это вызвано тем, что ваша активность не привязана к окну.(Соответствующей строкой Activity.java является getWindow().findViewById(id);.) Поскольку вы переключаете представления вкладок, когда нажимаете кнопку, запускающую AsyncTask, я думаю, что именно это и вызывает проблему.

Вы будетедолжны организовать ваши обновления для учета этого.Попробуйте изменить AsyncTask так, чтобы он просто отправлял обратный вызов вашей активности.В своей деятельности вы можете отслеживать состояние прикрепления окна, переопределяя onAttachedToWindow и onDetachedFromWindow, и можете либо внести изменения немедленно, либо подождать, пока оно будет прикреплено.

...