AsyncTask - 处理我得到的代码在哪里更好?

时间:2012-06-12 18:04:08

标签: android android-asynctask

我有一个远程调用,我想知道在哪里放置这个处理代码更好:

        if ( result == null )
        {       
            Toast.makeText(getApplicationContext(), "Some error message", Toast.LENGTH_LONG).show();                                

        }
        else
        if ( result.equals( "all_problems_db_error" ))
        {
        Log.d( "AllBusinessesActivity" , "result: " + result )                                      
        }
        else
        {
            // Unwrap the stuff from the JSON string                
            String problem_title = null;
            String problem_id = null;

            try
            {
                JSONArray obj = new JSONArray(result);

                if ( obj != null )
                {
                    problems.clear();

                    for ( int i = 0; i < obj.length(); i++ )
                    {
                        JSONObject o = obj.getJSONObject(i);

                        problem_title = o.getString("problem_title");
                        problem_id = o.getString("problem_id");

                        Problem p = new Problem ( );
                        p.setProblemId(problem_id);                         
                        p.setProblemName(problem_title);

                        problems.add( p );
                    }

                    adapter.notifyDataSetChanged();             

                }                                   
            }
            catch ( Exception e )
            {
           // Do something :)
            }               
        }

将它放在onPostExecute()或最后或doInBackground()中更好吗?

我现在在onPostExecute()中执行此操作,但每隔一段时间我就会遇到一些缓慢的问题,而且我一直在阅读在doInBackground中执行此操作可能会更好。

有人可以向我解释一下这个区别吗?如果我在doInBackground()中执行此操作,那么使用onPostExecute方法的目的是什么?

2 个答案:

答案 0 :(得分:2)

当您需要在UI线程上执行操作时,onPostExecute方法很有用。实际上,无法doInBackground方法中的UI进行任何操作。

因此,尝试在doInBackground方法中进行所有数据的计算/下载等操作,并仅使用onPostExecute方法对UI进行操作。

答案 1 :(得分:0)

Is it better to have it in the onPostExecute()

由于在您的情况下没有任何UI组件的操作,您可以使用doInBackground()中的代码。但是,由于您在结果为toast时显示null,因此可以在doInBackground()中检查结果,如果结果不为空,则可以对该{{1}进行剩余处理在相同的功能中,您可以传递到result,您可以在其中显示onPostExecute()

toast 是。您可以在at the end or doInBackground()的末尾使用此代码,因为此方法在非UI线程上运行,这肯定会减少您遇到的缓慢。

这两种方法doInBackground()doInBackground()之间的区别仅仅在于前者在非UI线程上运行而后者在UI-Thread上运行。

onPostExecute()

通常And if I do this in the doInBackground() then what is the purpose of having the onPostExecute method用于执行耗时的操作。这些操作可能包括调用Web服务或从服务器获取映像等活动。在这种情况下(比如从服务器获取图像),您希望图像显示在屏幕上(这是您的UI)。获取这些资源后,您将数据传递到doInBackground(),您可以在其中更新UI,因为它在您的UI线程上运行。

希望这个解释清除你的怀疑。