1

我目前正在尝试将我在 API10 中创建的应用程序的 MainActivity 代码转换为 API 16。根据我的阅读,我必须开始使用 ASyncTask 来访问 URI 并在我的应用程序上显示信息。我在 2.3 中设法做到了,但在将其转换为 JSON 后,我现在面临一些障碍。

本质上,该应用程序所做的是,它需要一个清单代码,即 WAMF33000,然后单击一个按钮,Spinner 就会填充该清单中包含的作业。由于我对 ASyncTask 的概念相当陌生,因此我想了解我的代码如何应用于 ASyncTask 背后的理论。

根据我的代码,我有一些问题:- i) 我在 ASyncTask 中的哪个代码是正在传递的参数?ii) 我的 AsyncTask 中的进度值是多少?iii) 最后,我的返回值是 ManifestItems 的 ArrayList 吗?

从 2.3 版本开始,我调用 JSON 两次 - 一次是在清单中加载货物,第二次是加载在微调器中选择的货物的详细信息。

以下是我的代码:

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); 
    }
}

我期待通过您对我的代码的建设性评论来了解更多关于 ASyncTask 的信息。提前感谢你们帮助我改进我的代码和我对 Android 的理解,伙计们!:)

PS:如果您需要更多代码,请告诉我。我会根据需要更新我的帖子,提供更多信息。干杯!

4

1 回答 1

3

背后的要点AsyncTask是允许您在单独的线程(例如网络内容)上运行后台工作,这样您就不会拖延,UI并且用户在下载数据时仍然可以做事。

我在 ASyncTask 中的哪个代码是正在传递的参数?

您目前没有将任何内容传递paramsAsyncTask

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

我的 AsyncTask 中的进度值是多少?

据我所知,你没有。如果您愿意,您可以使用publishProgress(value)onProgressUpdate()来更新下载的文件、进度时间、剩余时间等内容...

最后,我的返回值是 ManifestItems 的 ArrayList 吗?

你要回来jobList了,所以这就是onPostExecute()你需要做的事情

注意:要了解的最重要的事情之一AsyncTask是您无法更新UIfrom,doInBackground()因此您必须在其他方法之一中执行此AsyncTask操作或将值传递回UI函数。此外,AsyncTask在 2.3 中的工作方式与在 3.0 及更高版本中的工作方式不同。它们不再并行运行,而是放入队列中。因此,如果您希望它们在 4.2 中并行运行,您可能需要阅读有关 executeOnExecutor() 的信息。我希望这能回答你的问题

异步任务

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

我看到的其他几件事是,您需要将@Override注释添加到已实现的方法和super调用中。

于 2013-04-23T16:16:32.033 回答