2015-07-02 115 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。也许这也会导致瓶颈。

希望可以帮到...