Android正确的方法:在哪里应该parsingJSON响应 – 在UI线程中,还是在另一个?

我只是想知道 – 从Web服务器接收到的JSONObjectJSONArray应该在Android应用程序中parsing – 在主UI中还是应该传递给另一个?

例如,我正在使用Volley库:

 private void fetchResults(){ RequestQueue queue = Volley.newRequestQueue(mContext); String url = AuthenticationRequester.URL_GET_ALL_ORDERS; JsonArrayRequest jsonDepartureObj = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray jsonArray) { iVolleyCallback.onJSONArraySuccess(jsonArray); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); // hide the progress dialog } }); queue.add(jsonDepartureObj); } 

所以我应该把iVolleyCallback.onJSONArraySuccess(jsonArray); 在另一个线程执行还是可以维持主UI线程?

假设传入的JSON很大,需要一些时间才能继续?

同样的问题涉及到AsyncTask和其他可能的方式来处理Android中的Web服务。

Solutions Collecting From Web of "Android正确的方法:在哪里应该parsingJSON响应 – 在UI线程中,还是在另一个?"

最好是,每一个需要很长时间的任务,都应该在另一个线程中处理,以避免重载MainThread

理想情况下,AsyncTasks应该用于短操作(最多几秒)。如果需要长时间运行线程,强烈build议您使用java.util.concurrent包提供的各种API,例如执行器 , ThreadPoolExecutor和FutureTask 。

所以,如果你知道你有大数据 ,这将需要时间,你将使用新的线程 ,但如果数据很小 ,花费的时间less,为什么要冒这个风险? 移动到新的线程

如果像你自己所说的那样,JSON数据可能很大,而且可能需要一些时间来处理,我想你可以(或者应该)尝试在AsyncTask处理它。 通过这样做你的UI线程在处理过程中不会被冻结。

在大多数GUIdevise(不仅仅是Android)中,有几个线程有不同的angular色和责任:

  • 以“正常”调度优先级运行的“主线程”基本上没有别的事情,只能及时响应用户界面系统的需求。 当“消息”到达其消息时,此线程立即抢占其他线程,以便可以快速处理消息。 就像任何一位优秀的经理一样…… ;-)他们自己不做这项工作。 他们把它传递给其他人。

  • 当涉及asynchronous请求(JSON等)时,通常有一小块“线程池”负责将这些请求发送给主机,接收响应,进行编码/解码,然后作用于回应或传递。 这些线程几乎全部在主机上等待。 他们的调度优先级稍低。

  • 工作者线程以更低的优先级运行,从事任何计算耗时的工作。 尽可能多的这些线程不会做太多的I / O。 他们可以快速而轻松地将时间片放到其他任何线程中,但是当他们能够得到时间片时,他们通常会耗费整个时间片。

潜在的长时间运行的操作应该总是发生在一个单独的线程上,或者真正的任何工作(在合理的范围内),可以在一个单独的线程上完成。

在你的情况下,你使用的是Volley,所以你很容易覆盖你的Request<T>parseNetworkResponse(NetworkResponse response) 。 方法,并在传递之前在后台线程上parsing响应(因为此方法已经在后台线程上运行)。 由于它是相对无缝的,所以实际上没有理由不在后台线程上parsing响应。

试试这个https://github.com/yakivmospan/volley-request-manager

 //Queue using custom listener RequestManager.queue() .useBackgroundQueue() .addRequest(new TestJsonRequest(), mRequestCallback) .start(); private RequestCallback mRequestCallback = new RequestCallback<JSONObject, ResultType>() { @Override public ResultType doInBackground(JSONObject response) { //parse and save response data return new ResultType(); } @Override public void onPostExecute(ResultType result) { //update UI here Toast.makeText(getApplicationContext(), "Toast from UI", Toast.LENGTH_SHORT).show(); } @Override public void onError(VolleyError error) { //handle errors here (UI thread) Le(error.toString()); } };