Populating Spinner with JSON in Android 4.2 using

2019-07-27 08:00发布

问题:

I am currently trying to translate the code for the MainActivity of an app that I created in API10 into API 16. From what I have read, I have to start using ASyncTask to access a URI and display the information on my app. I managed to do that in 2.3, but after translating it to JSON, I am now facing some roadblocks.

Essentially, what the app does is that, it takes a manifest code i.e. WAMF33000 and at the click of a button, the Spinner is populated with the jobs contained in that manifest. As I am fairly new to the concept of ASyncTask, I would like to understand how my code applies to the theory behind ASyncTask.

Based on my code, I have some questions:- i) Which of my code in the ASyncTask is the parameter that is being passed? ii) What is the progress value in my AsyncTask? iii) Finally, is my return value the ArrayList of ManifestItems?

As of the 2.3 version, I invoke the JSON twice - once to load the consignments within the Manifest, and the second time to load details of a consignment selected in the spinner.

The following is my code:

package com.signonglass;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import org.json.*;

import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity
{
    private final static String POD_URI = "http://192.168.0.105:8092/PodCore.svc";
    private EditText evManifestCode;
    private Spinner list_job;
    private Button btnSubmit;
    private String jobName;
    private Button btnCons;
    ArrayList<ManifestItemObj> jobList = new ArrayList<ManifestItemObj>();
    ArrayList<ConsignmentItems> conItemList = new ArrayList<ConsignmentItems>();
    Consignments retConsignment;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        evManifestCode = (EditText)findViewById(R.id.manifest);
        btnSubmit = (Button)findViewById(R.id.btnSearchManifest);
        list_job = (Spinner)findViewById(R.id.jobSpinner);
        //tvView = (TextView)findViewById(R.id.deviceIdt);



        //TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
        //String IMEI_Number = telephonyManager.getDeviceId();
        //tvView.setText("IMEI Number: " + IMEI_Number);

    }

    public class MyAsyncTask extends AsyncTask<String, Void, ArrayList<ManifestItemObj>>
    {

        protected void onPreExecute()
        {

        }

        protected void onPostExecute(ArrayList<ManifestItemObj> jobList)
        {

        }

        @Override
        protected ArrayList<ManifestItemObj> doInBackground(String... params)
        {
            //http get request
            HttpGet request = new HttpGet(POD_URI + "/getJobs/" + evManifestCode.getText().toString());
            //set the hedear to get the data in JSON format
            request.setHeader("Accept", "application/json");
            request.setHeader("Content-type", "application/json");

            DefaultHttpClient client = new DefaultHttpClient();
            String theString = new String("");

            try
            {
                //get the response
                HttpResponse response = client.execute(request);
                HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                StringBuilder builder = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                                builder.append(line);
                        }
                is.close();
                theString = builder.toString();

                JSONObject jobsJSON = new JSONObject(theString);
                JSONArray jobs = jobsJSON.getJSONArray("getJobsResult");

                for(int i = 1; i < jobs.length(); i++)
                {
                    JSONObject mit = jobs.getJSONObject(i);
                    ManifestItemObj mi = new ManifestItemObj();
                    mi.ManifestItemID = mit.getInt("ManifestItemID");
                    mi.JobType = mit.getString("JobType");
                    mi.FKID = mit.getInt("FKID");
                    jobList.add(mi);
                }      
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            return jobList;
        }
    }


    /*private void showToast(String msg)
    {
        // TODO Auto-generated method stub
        Toast.makeText(this, "Toast: " + msg, Toast.LENGTH_LONG).show();
    }*/

    public void onViewConsignment(View view)
    {
        ShowItemsOfManifest(retConsignment);
    }

    public Consignments getConsignmentManifest(String consignment)
    {
        Consignments con = new Consignments();

        try
        {
            DefaultHttpClient client = new DefaultHttpClient();
            String theString = new String("");
            //http get request
            HttpGet request = new HttpGet(POD_URI + "/getJobDetails/" + consignment);
            //set the hedear to get the data in JSON format
            request.setHeader("Accept", "application/json");
            request.setHeader("Content-type", "application/json");

            //get the response
            HttpResponse response = client.execute(request);
            HttpEntity entity = response.getEntity();
            InputStream is = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));

            StringBuilder builder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null)
            {
                builder.append(line);
            }
            is.close();

            theString = builder.toString();

            JSONObject conJSON = new JSONObject(theString);
            JSONArray cons = conJSON.getJSONArray("getJobDetailsResult");

            for(int i = 0; i < cons.length(); i++)
            {
                JSONObject cObj = cons.getJSONObject(i);
                con.ConsignmentID = cObj.getInt("ConsignmentID");
                con.ConsignmentCreationDate = cObj.getString("ConsignmentCreationDate");
                con.ConsignmentCustRef = cObj.getString("ConsignmentCustRef");
                con.OrderNo = cObj.getString("OrderNo");
                con.ConsignmentActive = cObj.getBoolean("ConsignmentActive");
                con.JobType = cObj.getString("JobType");

                //Client object
                JSONObject clObj = cObj.getJSONObject("Client");
                Clients cl = new Clients();
                cl.ClientId = clObj.getInt("ClientID");
                cl.ClientName = clObj.getString("ClientName");
                con.Clients = cl;

                //ShipTo object
                JSONObject stObj = cObj.getJSONObject("ShipTo");
                ShipTo sto = new ShipTo();
                sto.ShipToId = stObj.getInt("ShipToId");
                sto.ShipToName = stObj.getString("ShipToName");
                sto.ShipToAddress1 = stObj.getString("ShipToAddress1");
                sto.ShipToAddress2 = stObj.getString("ShipToAddress2");
                sto.ShipToCity = stObj.getString("ShipToCity");
                sto.ShipToPostcode = stObj.getString("ShipToPCode");
                sto.ShipToState = stObj.getString("ShipToState");
                con.ShipTo = sto;

                //FreightZone object
                JSONObject fzObj = cObj.getJSONObject("FreightZone");
                FreightZones fz = new FreightZones();
                fz.FreightZoneID = fzObj.getInt("FreightZoneId");
                fz.FreightZone = fzObj.getString("FreightZone");
                con.FreightZone = fz;

                JSONArray conItems = cObj.getJSONArray("ConsignmentItems");

                for(int m = 0; m < conItems.length(); m++)
                {
                    JSONObject cit = conItems.getJSONObject(m);
                    ConsignmentItems ci = new ConsignmentItems();
                    ci.ConsignmentItemID = cit.getInt("ConsignmentItemsID");
                    ci.Quantity = cit.getInt("QTY");

                    //get Product from ConsignmentItems
                    JSONObject pro = cit.getJSONObject("Products");
                    Products prod = new Products();
                    prod.ProductId = pro.getInt("ProductID");
                    prod.ProductModel = pro.getString("ProductModel");
                    prod.ItemsPerCarton = pro.getInt("PerCarton");
                    prod.ProductDescription = pro.getString("Description");
                    prod.Height = (float) pro.getDouble("Height");
                    prod.Length = (float) pro.getDouble("Length");
                    prod.Width = (float) pro.getDouble("Width");
                    prod.Cubic = (float) pro.getDouble("Cubic");
                    ci.Product = prod;
                    conItemList.add(ci);
                    con.ConsignmentItems = conItemList;
                }
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return con;
    }

    public void ShowItemsOfManifest(Consignments consignments)
    {
        Bundle bundle = new Bundle();
        Intent newIntent = new Intent(this.getApplicationContext(), ConActivity.class);
        newIntent.putExtras(bundle);
        newIntent.putExtra("Consignment", consignments);

        this.startActivity(newIntent);

    }

    public void onSearchClick(View view)
    {
        new MyAsyncTask().execute();
        ManifestItemAdapter mia = new ManifestItemAdapter(MainActivity.this, android.R.layout.simple_spinner_item, jobList);
        list_job.setAdapter(mia); 
    }
}

I look forward to understanding more about ASyncTask through your constructive comments on my code. Thanks ahead for helping me improve my code and my understanding of Android, guys! :)

PS: Please let me know if you need any more code to work with. I will update my post with more information as necessary. Cheers!

回答1:

The point behind AsyncTask is to allow you to run background work on a separate thread such as networking stuff so you don't hold up the UI and users can still do things while data is being downloaded.

Which of my code in the ASyncTask is the parameter that is being passed?

You currently are not passing any params to the AsyncTask

new MyAsyncTask().execute(); // you would put params in here if needed such as a URL, String, etc...

What is the progress value in my AsyncTask?

As far as I can tell, you don't have one. If you wanted to you could use publishProgress(value) and that would be sent to onProgressUpdate() to update things like files downloaded, time of progression, time left, etc...

Finally, is my return value the ArrayList of ManifestItems?

you are returning jobList so that is what will get sent to onPostExecute() to do what you need with it

Note: One of the most important things to understand about AsyncTask is that you can't update the UI from doInBackground() so you must do this in one of the other AsyncTask methods or pass values back to a UI function. Also, AsyncTask works differently in 2.3 than it does in 3.0 and beyond. They don't run in parallel any more but put into a queue. So you may want to read about executeOnExecutor() if you want them to run in parallel in 4.2. I hope this answers your questions

AsyncTask

executeOnExecutor()(http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor(java.util.concurrent.Executor, Params...)

A couple other things I see is that you will want to add the @Override annotation to the implemented methods as well as super calls.