2016-04-04 17 views
0

Değerleri almak için kullandığım yöntem budur.Birden çok değeri AsyncTask/doInBackground'dan döndürün ve diğer yöntemde kullanın

@Override 
    protected Void doInBackground(String... params) { 
     try { 

      Intent intent = getIntent(); 
      String dvlaNumFin = intent.getStringExtra("dvlaNumber"); 

      final TextView outputView = (TextView) findViewById(R.id.showOutput); 
      final URL url = new URL("https://dvlasearch.appspot.com/DvlaSearch?licencePlate="+dvlaNumFin+"&apikey="); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

      connection.setRequestMethod("GET"); 
      connection.setRequestProperty("USER-AGENT", "Mozilla/5.0"); 
      connection.setRequestProperty("ACCEPT-LANGUAGE", "en-US,en;0.5"); 

      final StringBuilder output = new StringBuilder(String.valueOf(url)); 

      BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
      String line = ""; 
      StringBuilder responseOutput = new StringBuilder(); 
      System.out.println("output===============" + br); 
      while ((line = br.readLine()) != null) { 
       responseOutput.append(line); 
      } 
      br.close(); 

      HandleJSON obj = new HandleJSON(""); 

      obj.readAndParseJSON(responseOutput.toString()); 

      output.append(System.getProperty("line.separator") + "\n" + System.getProperty("line.separator") + "Make : " + obj.getMake() + "\nModel : " + obj.getModel()); 
      output.append("\nSix Month Rate : " + obj.getSixMonthRate() + "\nTwelve Month Rate : " + obj.getTwelveMonthRate() + "\nDate of First Registration : " + obj.getDateofFirstRegistrationegistration()); 
      output.append("\nYear of Manufacture : " + obj.getYearOfManufacture() + "\nCylinder Capacity : " + obj.getCylinderCapacity() + "\nCO2 Emmissions : " + obj.getCo2Emissions()); 
      output.append("\nVIN number : " + obj.getVin() + "\nTransmission type : " + obj.getTransmission()); 

      DVLAresult.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        outputView.setText(output); 
        progress.dismiss(); 

       } 
      }); 

     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 

I JSON'dan obj.getMake() ve bu yüzden, değerler kullanmak istiyorum. Ama nasıl yapılacağını anlamayın ya da geri verin. Geri dönüş değeri ya da finali kullanmalıyım.

+1

AsyncTask sınıfınızın içindePostExecute yöntemini uygulayın :) Adından da anlaşılacağı gibi, doInBackground uygulamanız bittiğinde bu çağrılır. OnPostExecute'dan aramak istediğiniz yöntemi çağırıp, onPostExecute uygulamasında aldığınız yanıtı parametre olarak iletin :) Thats all :) –

+0

http://stackoverflow.com/questions/9458258/return-value-from-async-task -in-android –

+2

[AsyncTask Android örneği] 'nin olası kopyası (http://stackoverflow.com/questions/9671546/asynctask-android-example) –

cevap

1

SİS

Basitçe örneğin

:) senin AsyncTask sınıf içinde OnPostExecute uygulamak:

@Override 
protected void onPostExecute(String makeValue) { 
    // remember this method gets called on main thread 
    letsCallFogsMethod(makeValue); //call your method and pass the make value here :) 
} 

Thats dostum :) Şimdi bu nasıl OnPostExecute herhangi bir değer elde ettiğini gel ??? Size doInBackground imza dostum herhangi bir değişiklik fark ettiniz mi doInBackground yöntemi dostum :)

@Override 
protected String doInBackground(String... params) { 
    //after all bra bla simply say 
    return obj.getMake(); 
} 

gibi onu iade etmek zorunda ?? Evet ben size doInBackground yürütme bittiğinde ben yazarsanız cevap olduğu gibi OnPostExecute bir dize :) Yani

döneceğini bildiren olan Dize yazarak dize :)

Void değiştirildi olacak işe yarıyor mu? Hayır! Eğer

private class FogsAsyncTask extends AsyncTask<bla,blah,Void> { 

son Void görebiliyor benzeyebilecek sizin doInBackground senin zaman uyumsuz görev imzasında Void belirttiniz göz önüne alındığında ??? :) Ama şimdi chnaged gelmiş doInBackground o kadar yanı AsyncTask imza :)

private class FogsAsyncTask extends AsyncTask<bla,blah,String> { 

Şimdi :) :) ince Mutlu kodlama dostum çalışmak cevabım sana :)

+0

new GetClass (this) .execute(); Bunu kullanarak ben yürütebilirim ve sonuç alabilirim, ancak sadece tek değerleri nasıl kullanabilirim? –

+0

Bununla ne demek istiyorsun? Üzgünüz, soruyu düzgün bir şekilde dinliyorum, onPostExecute için bir değer daha sonra geçmek ister misiniz? İstediğin bu mu??? –

+0

Ana Fikir, değerleri tam olarak almak, sadece tam veriyi göstermemek. 1) bu değerlere dayanarak bu veriyi veri tabanına göndermek istiyorum 2) Kullanıcının yönlendirileceği URL'nin bir parçası olarak bu verilerin bir kısmını kullanmak istiyorum. –

0
yardımcı Umut gerektiğini güncellemek değil

Sen OnPostExecute yöntemine çıkış sadece yöntemini geçersiz ve ona

0

AsyncTask üzerine çıktı alabilirsiniz alabilirsiniz üç (ana) yöntemleri, onPreExecute, doInBackground ve onPostExecute sahiptir. Sadece doInBackGround bir arka plan iş parçacığı üzerinde çalışır, diğer iki UI iş parçacığı üzerinde çalışır. (Ayrıca onProgressUpdate var ama burada atlar) doInBackground yönteminde istediğiniz her şeyi iade Senin durumunda

. Bu dönüş değeri, onPostExecute için giriş parametresi olacaktır. Orada istediğiniz herhangi bir (ulaşılabilir) yöntemini çağırabilirsiniz. O zaman UI iş parçacığının içinde çalışacağınıza dikkat edin.

1

Güzel ve basit. senin AsyncTask bir değer döndürmek olun:

public class TestClass extends AsyncTask<Void, Void, String>{ 

@Override 
protected String doInBackground(String... params) { 
//rest of code 

return output.toString(); 
} 
} 

Şimdi yapmanız gereken tek şey çağrıldıktan sonra .get() yöntemini çağırmak.yürütmek()

TestClass tc = new TestClass(); 
tc.execute(); 
String output = tc.get(); 

Çok Çok Önemli Not sağ AsyncTask yapılana kadar .Execute() UI iş parçacığı engellenir sonra) (.get arayarak

. Bu AsyncTask amacına karşı sezgiseldir. Bu problemin çözümlerinden biri, AsyncTask'a bir terfi ara yüzü eklemektir; bu, bitirme üzerine çağrılacak ve bu arabirimin uygulanmasında .get() yöntemini çağırmalıdır. Geri arama arabiriminin nasıl tasarlanacağı hakkında bir örnek için bkz. here.

İlgili konular