[英]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線程。 也許這種方法很慢。 基本上使用onPreExecute
和onPostExecute
,可以快速完成任何需要完成的工作。
我認為你不需要調用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.