【问题标题】:Having Trouble with Async Task and Flow of Program异步任务和程序流程有问题
【发布时间】:2014-03-06 20:13:20
【问题描述】:

我目前正在设计一个应用程序,让用户可以阅读新闻文章以及从 Internet 获取信息以填充列表并将其显示给用户所必需的信息。我已经完成了所有的解析工作,并且文章的正确信息可以正常返回。我的应用程序中有一个带有片段的主要活动,这些活动是使用视图寻呼机设置的。所以我有三个选项卡,用户可以在它们之间切换。这看起来类似于目前市场上的 Zedge 应用程序。由于我有单独的片段,将异步任务放在我的应用程序中的明智之处在哪里?

我本来打算把它放在主活动的 onCreate 方法中,但由于异步任务与 UI 线程同时在后台运行,因此由于异步任务尚未完成,因此设置为空白,其中没有任何内容。似乎当我的 asyc 任务是 postExecute 方法时,UI 设置已经完成或几乎完成,并且应该从异步任务返回的变量(一个数组列表)是空的。而且我猜我不能只将返回的 onPostExecute 值分配给静态变量,因为我不知道异步任务何时会与 UI 线程相关?

我还有另一个想法,将更新片段 UI 的方法放入它们的类中,并让 onPostExecute 调用它们来修改事物(即重新填充 UI 元素)。我知道让 UI 线程显式等待不是一个好主意,所以我试图避免这种情况。我的异步任务至少可以吗?希望我所说的一切听起来不像是一堆乱七八糟的东西。如果有人可以帮助我了解如何加载我的应用程序信息,我将不胜感激!

private class GetArticlesFromRSS extends
        AsyncTask<Void, Void, ArrayList<Article>>
{

    ArrayList<Article> retArtList = new ArrayList<Article>();
    ProgressDialog dialog = new ProgressDialog(MainActivity.this);


    @Override
    protected void onPreExecute() {
            dialog = new ProgressDialog(MainActivity.this);
            dialog.setMessage("Loading...");
            dialog.setIndeterminate(true);
            dialog.setCancelable(false);
            dialog.show();
        }

    @Override
    protected ArrayList<Article> doInBackground(Void... v)
    {

        // TODO Auto-generated method stub
        artReaderObj = new ArticleRSSReader(urlArticles);

        try
        {
            artReaderObj.fetchXML();
        }
        catch (InterruptedException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch(IOException ioe)
        {

            task1.cancel(true);

        }

        while (artReaderObj.parsingComplete)
            ;
        retArtList.addAll(artReaderObj.getArticles());


        return retArtList;
    }

    @Override
    protected void onPostExecute(ArrayList<Article> result)
    {
        dialog.dismiss();
        articlesReturned = result;


        if (MainActivity.articlesReturned.size() > 0){
            Toast.makeText(getApplicationContext(), "Ok", Toast.LENGTH_LONG).show();
        }
        else{
            Toast.makeText(getApplicationContext(), "Error, Check Network Connection.", Toast.LENGTH_LONG).show();
        }

    }

}

【问题讨论】:

  • 我唯一不太明白的...你的问题是什么?如何让你的 UI 不显示空白信息?

标签: java android multithreading asynchronous


【解决方案1】:

有一种简单的解决方案可以克服并返回任何类/活动/片段中的数据。

您已经在 asynctask 类中编写了一个自定义侦听器(在您的情况下为 GetArticlesFromRSS),并在 onPostExecute 方法中调用了侦听器。

监听器示例

    public interface OnAsyncResult {  
        public abstract void onResultSuccess(ArrayList<Article> result);  
        public abstract void onResultFail(int resultCode, String errorMessage);  
   }

在“GetArticlesFromRSS.java”中的 OnAsyncResult 上创建对象 让我们说

OnAsyncResult onAsyncResult = null;

setOnAsyncResult(OnAsyncResult callBack)
{
  this.onAsyncResult = callback;
}

然后在您的 post execute 方法中,您可以如下使用此侦听器

@Override
protected void onPostExecute(ArrayList<Article> result)
{
    dialog.dismiss();
    articlesReturned = result;


    if (MainActivity.articlesReturned.size() > 0){
        if(onAsyncResult!=null)
            onAsyncResult.onResultSuccess(result);

        Toast.makeText(getApplicationContext(), "Ok", Toast.LENGTH_LONG).show();
    }
    else{
        if(onAsyncResult!=null)
            onAsyncResult.onResultFail(1, "Error, Check Network Connection.");

        Toast.makeText(getApplicationContext(), "Error, Check Network Connection.", Toast.LENGTH_LONG).show();
    }

}

这将解决您的目的。

【讨论】:

  • 这绝对是我正在寻找和需要的。我知道必须有某种设计来完成我正在寻找的东西。非常感谢你!我会回来报告的。
  • 现在我完全意识到您的解决方案的作用。我非常喜欢这个。谢谢。
【解决方案2】:

我认为在这种情况下使用服务会更好。当 UI 需要更新时可以绑定服务并获取信息。

【讨论】:

    【解决方案3】:

    无需让 UI 线程等待...

    postExecute 在 UI 线程上运行,因此您可以通过该方法设置您的 ui 元素。您应该定义如何在您的 Activity / Fragments 中设置它们,然后让 post execute 使用这些信息调用这些方法以更新 UI。

    此外,放大视图需要几分之一秒。您可以在通货膨胀后启动异步任务,以确保 UI 元素在那里。或者,如果您需要在通货膨胀之前启动异步(并且它可能在应用程序完成之前返回),您可以做一些更复杂的事情,比如缓存结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多