2015-07-02 166 views
1

的AsyncTask操作我新的Android開發方面,作爲我學習的一部分,我想提出一個多語種的新聞閱讀器應用程序,該應用程序的獲取RSS從谷歌新聞和解析飼料。返回類型爲

對於這一點,我使用標籤視圖顯示多國語言,用戶可以通過不同的語言刷卡。應用程序包含印地文,馬拉雅拉姆語,英語和泰米爾語標籤,所有列出特定的新聞項目。

每種語言視圖頁是獨立的片段。並且應用程序中共有四個片段,主要活動包含所有這些。

所有這些片段我有一個AsyncTask擴展類,它加載和解析來自server.and的新聞,並在其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()阻止用戶界面。所以我必須實現一個回調接口,任何人都可以幫助我做到這一點我已經從here讀了一點,但它將如何調用,以及如何將結果傳遞給MainActivity?

屏幕截圖

enter image description here

+1

順便說一句:調用'super.onPostExecute()'和'super.onPreExecute()'是沒用的,因爲在超類中沒有默認實現 –

+0

爲什麼你沒有使用onProgressUpdate來更新你的進度條? –

+0

bcs我沒有更新進度,只顯示一個微調,它已經足夠了 – droidev

回答

1

我已經得到了答案。

我已經作出了回調接口用於傳遞結果到碎片

public interface CallBackReciever { 

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

} 

並實現與片段此接口。

然後將該接口的上下文傳遞給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); 
    } 
} 
+0

有趣的答案!由於最終的結果是一個文本的ArrayList,你可以使用像Thread和Handler這樣的非UI線程嗎?我在NewsLoader中看不到很多UI處理。當然你知道的更好。恭喜! –

+0

@TheOriginalAndroid在我的doInBackground()方法中有一個名爲processNews()的方法,它從互聯網獲取新聞並返回解析的xml。使AsyncTask成爲強制性的。 – droidev

+0

即使有這項工作,它也不涉及用戶界面。那麼也許你可以在Runnable中使用Thread類? –

1

Asynctask.get()方法塊中的UI直到doInBackground()結束。您可以使用onPostExecute()來在UI上交付結果。

+0

可以藉助示例或任何鏈接來解釋嗎? – droidev

+0

對不起,我沒有一個具體的鏈接,但網上有一些關於android後臺處理的教程。 – GPack

1

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

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

希望可以幫到...