2013-04-23 52 views
1

我正在嘗試將我在API10中創建的應用程序的MainActivity代碼轉換爲API 16.從我讀過的內容中,我必須開始使用ASyncTask來訪問URI並在我的應用程序上顯示信息。我在2.3版中設法做到了這一點,但在將其翻譯成JSON之後,我現在面臨一些障礙。使用AsyncTask在Android 4.2中使用JSON填充微調器

本質上,應用程序所做的是,它需要一個清單代碼,即WAMF33000,在點擊一個按鈕時,微控制器將填充該清單中包含的作業。由於我對ASyncTask的概念相當陌生,我想了解我的代碼如何應用於ASyncTask背後的理論。

基於我的代碼,我有一些問題: - i)ASyncTask中的哪個代碼是要傳遞的參數? ii)我的AsyncTask中的進度值是多少? iii)最後,我的返回值是ManifestItems的ArrayList?

從2.3版開始,我調用JSON兩次 - 一次在Manifest中加載貨物,第二次加載在微調器中選擇的貨物的詳細信息。

下面是我的代碼:

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:請讓我知道你是否需要任何更多的代碼來處理。我會根據需要更新我的文章以獲取更多信息。乾杯!

回答

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是,你可以不從doInBackground()更新UI,因此您必須在其他AsyncTask方法之一中執行此操作,或將值傳遞迴UI函數。此外,AsyncTask在2.3中的工作方式與在3.0及更高版本中的工作方式不同。他們不再平行運行,而是放入隊列中。所以你可能想要閱讀有關executeOnExecutor(),如果你想讓它們在4.2中並行運行。我希望這回答了你的問題

AsyncTask

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

幾個其他的事情我看到的是,你將要在@Override註釋添加到實現的方法以及super電話。

+0

嗨@codeMagic,謝謝你。如果它的工作,我會再次把代碼,讓你看看。 – cmnunis 2013-04-24 01:30:51

+0

不客氣。我不確定你是否問我另一個問題,或者你想讓我看看 – codeMagic 2013-04-25 01:37:23

+0

我已經設法讓它工作。微調器現在加載。我會爲服務被調用的其他區域執行此操作。只要我重新完成MainActivity,我會盡快分享答案。 – cmnunis 2013-04-25 15:36:36