Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中,如何将数据加载分离到自己的线程中?_Java_Android_Multithreading - Fatal编程技术网

Java 在android中,如何将数据加载分离到自己的线程中?

Java 在android中,如何将数据加载分离到自己的线程中?,java,android,multithreading,Java,Android,Multithreading,所以我正在用android/java开发我的hello world应用程序,并选择做一个奇怪的运动应用程序……我不喜欢运动……但不管怎样。所以我设置了我的布局,允许用户“向下搜索”,这样他们可以看到棒球、MLB或印第安人的布局。假设用户从MLB视图中选择“印第安人”。我更新选项卡,可能是颜色方案、背景等,并加载“新闻”和“球员”选项卡的数据,后者是团队布局所特有的。不幸的是,api调用有时需要相对较长的时间才能完成,特别是当ESPN的免费api限制为每秒1次调用时。我已经做了一些重要的缓存,但我

所以我正在用android/java开发我的hello world应用程序,并选择做一个奇怪的运动应用程序……我不喜欢运动……但不管怎样。所以我设置了我的布局,允许用户“向下搜索”,这样他们可以看到棒球、MLB或印第安人的布局。假设用户从MLB视图中选择“印第安人”。我更新选项卡,可能是颜色方案、背景等,并加载“新闻”和“球员”选项卡的数据,后者是团队布局所特有的。不幸的是,api调用有时需要相对较长的时间才能完成,特别是当ESPN的免费api限制为每秒1次调用时。我已经做了一些重要的缓存,但我无法保证我不会同时为“印第安人”加载“新闻”和“玩家”,因此其中一个请求必须等待整整一秒钟才能返回

因此,我的解决方案是有一个数据加载线程——UI说“给我这个数据”,并且UI是否工作不取决于数据是否存在。但问题是——一旦数据从数据加载器返回,当每个片段返回时,它应该如何适当地更新或通知UI?我目前的想法是:

UI线程:

OnSelectIndians()
{
  DataLoadThread.GetIndiansPlayers();
  DataLoadThread.GetIndiansNews();
  // UI stuff
}

OnPlayersLoaded(Array Players)
{
  if (layout == INDIANS_LAYOUT)  // Make sure we haven't changed layouts
  {
    foreach player in Players
      tab[PLAYERS].textview.text += player
  }
}
但这不是我以前必须解决的问题。这样做对吗?或者我可以使用更好/更简单的设计吗?我并不特别喜欢要求UI线程对我可以请求的每种类型的数据都有一个“on data returned”方法。我的另一个松散形式的想法是在UI代码中创建一个lambda函数,该函数被传递到数据加载程序并在数据加载线程中执行,因此:

DataLoadThread.Queue(
    foreach player in GetIndiansPlayers()
        myView.tab[PLAYERS].textview.text += player;
);
但我认为这可能是更糟糕的途径,因为现在我们有两个线程与UI交互。有什么建议吗

编辑:好的,我使用AsyncTask实现了它。开箱即用,它仍然存在上面列出的问题,如果我加载PlayerLoadTask、NewsLoadTask、StandingLoadTask等数据,那么我必须为每种类型创建一个新的派生类。我还希望在调用过程中看到大部分逻辑,因此如果我查看事件代码,我知道它在做什么。下面是正在工作的实现——如果您能提供任何反馈,我将不胜感激,但我还是会接受下面的第一个答案

抽象公共类LoadDataHelper{ 公共LoadDataHelperDataLoader dl,对象参数{ mDataLoader=dl; mParam=param; }

    abstract public LinkedList<String> LoadData();
    protected DataLoader mDataLoader;
    protected Object mParam;
}

abstract public class UpdateUIHelper {
    public UpdateUIHelper(MyActivity context) {
        mContext = context;
    }

    abstract public void UpdateUI(LinkedList<String> results);
    protected MyActivity mContext;
}

private class LoadDataTask extends AsyncTask<Void, Void, LinkedList<String> >   {
    private LoadDataHelper mLdh;
    private UpdateUIHelper mUih;

    LoadDataTask(LoadDataHelper ldh, UpdateUIHelper uih) {
        mLdh = ldh;
        mUih = uih;
    }

    @Override
    protected LinkedList<String> doInBackground(Void... params) {
        return mLdh.LoadData();
    }

    @Override
    protected void onPostExecute(LinkedList<String> results) {
        mUih.UpdateUI(results);
    }
}

//
// .....
// 

    LoadDataTask task = new LoadDataTask(new LoadDataHelper(mDataLoader, "football") {
                                            public LinkedList<String> LoadData() {                                                  
                                                return mDataLoader.LoadLeaguesFromSport((String)mParam);
                                            }
                                        }, 
                                        new UpdateUIHelper(this) {
                                            public void UpdateUI(LinkedList<String> results) {
                                                TextView tv = (TextView)findViewById(R.id.tv1);
                                                tv.setText("");
                                                for (String res : results) {
                                                    tv.append(res + "\n");  
                                                }
                                            }
                                        });
    task.execute();
看看:

1异步任务

AsyncTask.onPostExecute将在UI线程中执行。 我认为这是做背景处理最常用的技术

2 runOnUIThread:如果您正在管理自己的工作线程,您可以在工作线程中使用它来确保代码在UI线程上运行。

查看:

1异步任务

AsyncTask.onPostExecute将在UI线程中执行。 我认为这是做背景处理最常用的技术


2 RunUnuithRead:如果您正在管理自己的工作线程,您可以在工作线程中使用它来确保代码在UI线程上运行。

您最好的选择是使用AsyncTask。我创建了一个类似的应用程序,该应用程序对服务器进行了25次以上的调用以下载图像。使用AsyncTask将大大缩短这一时间,并且仍然可以提供出色的用户体验以下是关于如何使用/设置异步任务的精彩教程:


您最好的选择是使用AsyncTask。我创建了一个类似的应用程序,该应用程序对服务器进行了25次以上的调用以下载图像。使用AsyncTask将大大缩短这段时间,并且仍然可以提供出色的用户体验。下面是一个关于如何使用/设置AsyncTask的精彩教程:


异步任务是您的解决方案
是教程

异步任务是您的解决方案 这是一个教程

这是设计的目的, 这是我从中学到的

这就是你要做的

创建一个扩展AsyncTask的类 实施doInBackground和onPostUpdate方法 在onPostUpdate方法更新ui中,可以使用来避免ui更新期间出现任何问题 使用异步任务的优点是,您甚至可以更新进度并向用户显示可视指示器,如果需要,您也可以轻松取消任务以停止加载

AsyncTask本质上是一个帮助器,它简化了线程的使用, 这是我从中学到的

这就是你要做的

创建一个扩展AsyncTask的类 实施doInBackground和onPostUpdate方法 在onPostUpdate方法更新ui中,可以使用来避免ui更新期间出现任何问题 使用异步任务的优点是,您甚至可以更新进度并向用户显示可视指示器,如果需要,您也可以轻松取消任务以停止加载

AsyncTask本质上是一个简化线程使用的助手

最好让UI在UI线程中工作,而非UI在非UI线程中工作 ead,但自从蜂巢进入安卓系统后,这就成了一条法律

在安卓系统中有两种方法

一,。将Java线程与处理程序一起使用。。 创建一个线程来执行进程繁重的后台任务,然后使用 处理程序

二,。使用专门为Android设计的AsyncTask同步UI工作和非UI工作 工作AsyncTask也被称为无痛线程。

让UI在UI线程中工作总是更好,让非UI在非UI线程中工作总是更好,但这在Android中出现蜂巢之后就成为了一条法则

在安卓系统中有两种方法

一,。将Java线程与处理程序一起使用。。 创建一个线程来执行进程繁重的后台任务,然后使用 处理程序

二,。使用专门为Android设计的AsyncTask同步UI工作和非UI工作 工作异步任务也称为无痛线程