如何将数据从AsyncTask传递到Ui Thread

时间:2012-09-20 01:24:09

标签: android android-asynctask

我正在实现一个asyncTask类来从服务器加载数据。 我已经有了数据,我想将它传递给UI线程,但我不知道如何。

这是代码:

public class InboxHandler extends FragmentActivity implements OnLineSelectedListener {

    static final int GET_CODE = 0;
    private TextView textView3, textView2;
    private Button button1, button2, button3;
    private LinearLayout tab1, tab2, tab3;
    private CheckBox cbVerPorCategoria;
    private ActionBar actionBar;
    private TextView txtTitle;
    private Settings settings;
    FragmentTransaction fragmentTransaction;
    BottomPanel bottomPanel;
    public List<OrderRequest> orderRequestArray;
    private OrderRequestParser orderRequestParser;
    public static int number;
    int clickCounter = 0;
    private boolean doubleBackToExitPressedOnce = false;
    private static Context context;
    DataLoader dataLoader;
    private MyAsynckTask myAsynckTask;

    public InboxHandler(){}

    public List<OrderRequest> getOrderRequestArray() {
        return orderRequestArray;
    }

    public void setOrderRequestArray(List<OrderRequest> orderRequestArray) {
        this.orderRequestArray = orderRequestArray;
    }

    public static Context getContext()
    {
        return context;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_inbox);

        context = this.getApplicationContext();

        settings = Settings.getInstance();
        settings.setPrefs(getSharedPreferences(settings.getPREFERENCES(), Activity.MODE_PRIVATE));
        settings.setPrefsEditor(settings.getPrefs().edit());        
        settings.getPrefsEditor().putBoolean("isLoggedIn", true);
        settings.isVistaSimple = true;

        actionBar = (ActionBar) findViewById(R.id.actionbar);

        initComponents();
        prepareActionBar();
    }

    private void initComponents() {

        try {
            MyAsynckTask myAsynckTask = new MyAsynckTask(this); 
            myAsynckTask.execute(); 

            //HERE I USED A SUGGESTION IN A SIMILAR QUESTION. THAT IS: PASS THE ACTIVITY TO THE ASYNCTASK, AND FROM IT, SAVE IN THE ACTIVITY, THE DATA THAT IU WANT FROM THE ASYNCTASK. I DO THAT, BUT IN THE ACTIVITY, THE DATA IS NULL I SUPPOSE DUE TO, I DONT EVEN SEE IN THE LOGCAT,  THE FOLLOWING RESULT:

            try{
                Log.e("e", ""+this.getOrderRequestArray().get(0).getDocNumber());
            } catch(Exception e){
                e.printStackTrace();
            }

//If you see the onPostExecute, I test if the data I want is there. and it is there! I set that to the list of the class InboxHandler, but in the above code, when i try to test if it is there, it´s not. And that code don´t even appear in logcat. The "Log.e("e", ""+this.getOrderRequestArray().get(0).getDocNumber());" nor the "e.printStackTrace();"

            bottomPanel =new BottomPanel();
            Bundle bundle = new Bundle();
            bundle.putSerializable("arrayPedidos", (Serializable) orderRequestArray);
            bottomPanel.setArguments(bundle);

            //actionBar.setTitle("Inbox");
            NotificationFragment notificationFragment = new NotificationFragment(orderRequestArray, actionBar);

            Bundle bundleNotificationFragment = new Bundle();
            bundleNotificationFragment.putString("title", "Inbox");
            notificationFragment.setArguments(bundleNotificationFragment);

            fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.frame_list_container, notificationFragment);
            fragmentTransaction.add(R.id.frame_bottom_panel, bottomPanel);      
            fragmentTransaction.commit();

        } 
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

    private class MyAsynckTask extends AsyncTask {

        private String stringMensaje;
        public List<OrderRequest> orderRequestArray;
        private OrderRequestParser orderRequestParser;
        private Request request;
        private Settings settings;
        private InboxHandler inboxHandler;

        public MyAsynckTask(InboxHandler inboxHandler){
            this.inboxHandler = inboxHandler;
        }

        @Override
        protected Object doInBackground(Object... params) {

            List<OrderRequest> array = this.getOrderRequests();
            settings = Settings.getInstance();


            if(array != null){
                settings.setOrderRequestArray(array); 
                orderRequestArray = array;
                Log.e("orderRequestArray", "Me trajo el orderRequestArray en doInBackground!");
            } else {
                Log.e("orderRequestArray", "No me trajo el orderRequestArray en doInBackground!");
            }

            return array;

        }

        @Override
        protected void onPostExecute(Object result) {
            super.onPostExecute(result);

            List<OrderRequest> array = (List<OrderRequest>) result;

            this.setOrderRequestArray(array);

            if(orderRequestArray != null){
                inboxHandler.setOrderRequestArray(orderRequestArray);
                Log.e("orderRequestArray", "is not null en onPostExecute!");
            } else {
                Log.e("orderRequestArray", "is null en onPostExecute!");
            }


            if(inboxHandler.getOrderRequestArray() != null){
                Log.e("inboxHandler.getOrderRequestArray()", "is not null en onPostExecute!");
            }
            else {
                Log.e("orderRequestArray", "is null en onPostExecute!");
            }
        }


        public List<OrderRequest> getOrderRequests() {

            orderRequestParser = new OrderRequestParser();
            orderRequestArray = new ArrayList<OrderRequest>();
            List<OrderRequest> orderRequestArray = orderRequestParser.listOrderRequest();

            Settings.getInstance().setOrderRequestArray(orderRequestArray);
            if(orderRequestArray != null){
                Log.e("orderRequestArray", "Me trajo el orderRequestArray en getOrderRequestArray!");
            } else {
                Log.e("orderRequestArray", "No me trajo el orderRequestArray en getOrderRequestArray!");
            }

            return orderRequestArray;

        }

        public void setOrderRequestArray(List<OrderRequest> orderRequestArray) {
            this.orderRequestArray = orderRequestArray;
        }

        public List<OrderRequest> getOrderRequestArray() {
            return orderRequestArray;
        }
    }

1 个答案:

答案 0 :(得分:2)

protected void onPostExecute(Object result)

它在GUI线程中运行,您可以在那里访问GUI元素。

只有应该有:

        try{
            Log.e("e", ""+this.getOrderRequestArray().get(0).getDocNumber());
        } catch(Exception e){
            e.printStackTrace();
        }

    Bundle bundle = new Bundle();
    bundle.putSerializable("arrayPedidos", (Serializable) orderRequestArray);
    bottomPanel.setArguments(bundle);

我看不出任何理由,为什么这个问题被投票了。