簡體   English   中英

具有返回類型的AsyncTask操作

[英]AsyncTask operation with return type

我是android新手,作為我學習的一部分,我正在制作一個多語言新聞閱讀器應用程序,其中應用程序從谷歌新聞和解析中獲取RSS提要。

為此,我使用標簽視圖顯示多種語言,用戶可以通過不同的語言滑動。 應用程序包含印地語,馬拉雅拉姆語,英語和泰米爾語標簽,都列出了特定的新聞項目。

每個語言視圖頁面都是單獨的片段。 應用程序中總共有四個片段,主要活動包含所有這些。

對於所有這些片段,我有一個AsyncTask擴展類,它從服務器加載和解析新聞。並在其doInBackground方法上返回一個數組列表,但問題是當我從一個選項卡滑動到另一個選項卡時,它的工作速度非常慢。 我正在粘貼我的代碼。 我認為我的AsyncTask用法不正確,因為我在onPreExecute方法中顯示了一個進度條,但它也沒有正確顯示。

請任何人查看我的代碼,並幫助我糾正

EnglishNewsFragment.java

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
ArrayList<HashMap<String, String>> newsWrapper;
            context = getActivity();
            View rootView = inflater.inflate(R.layout.english_news_fragment, container, false);
            NewsLoader newsLoader = new NewsLoader(context, language);
            newsLoader.execute();
            try {

                newsWrapper = newsLoader.get();

            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } finally {
                showNews(newsWrapper);
            }
            return rootView;
        }

NewsLoader

public class NewsLoader extends AsyncTask{

    public NewsLoader(Context context, String language) {

            this.context = context;
            this.language = language;

        }

        @Override
        protected void onPreExecute() {

            startDialogue();
            initAll(language);
        }


        @Override
        protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
                       getNews();
                news = processXML();

            } catch (Exception e) {
                e.printStackTrace();
            }
            return news;
        }


        @Override
        protected void onPostExecute(ArrayList<HashMap<String, String>> aVoid) {
            super.onPostExecute(aVoid);
            stopDialogue();
        }
}

UPDATE

AsyncTask.get()阻止UI。 所以我必須實現一個回調接口,任何人都可以幫助我這樣做我從這里讀了一點但是它的調用將如何,以及如何將結果傳遞給MainActivity?

屏幕截圖

在此輸入圖像描述

Asynctask.get()方法阻止UI直到doInBackground()完成。 您可以使用onPostExecute()將結果傳回UI。

UI中的減速或瓶頸可能來自onPreExecute ()或onPostExecute ()。 添加類似Log.d ()的代碼並打印時序差異以查看導致瓶頸的代碼。 例如,代碼initAll(language)可以移動到doInBackground ()的非UI線程。 也許這種方法很慢。 基本上使用onPreExecuteonPostExecute ,可以快速完成任何需要完成的工作。

我認為你不需要調用super.onPreExecute()super.onPostExecute(aVoid) 谷歌的樣本不會這樣做或建議@AsyncTask 也許這也會導致瓶頸。

希望有幫助......

我有答案。

我已經建立了一個回調接口,用於將結果傳遞給Fragment

public interface CallBackReciever {

    public void recieveData(ArrayList<HashMap<String,String>> result);

}

並用fragment實現了這個接口。

然后將此接口的上下文傳遞給AsyncTask 並在其onPostExecute()方法中調用recieveData()方法

分段

@Override
    public void recieveData(ArrayList<HashMap<String, String>> result) {
        newsWrapper = result;
        showNewsOnUI();
    }

的AsyncTask

public class NewsLoader extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>>{

public NewsLoader(CallBackReciever callBackReciever) {
        this.callBackReciever = callBackReciever;
    }
 @Override
    protected void onPreExecute() {
        startDialogue();

    }
    @Override
    protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
        initAll(language);
        result = processNews()
        return result;
}
    @Override
    protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
        stopDialogue();
        callBackReciever.recieveData(result);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM