2017-10-19 161 views
-2

我是Java編程新手,有一個問題。我發現this後,並試圖使用此方法將我的值從doInBackground方法傳遞給onPostExecute方法。但Android Studio 2.3不支持它。Asynctask:將值從doInBackground傳遞到onPostExecute

Android Studio中強調我的@覆蓋在onPostExecute:

@Override 
    protected void onPostExecute(String s){ 
     //super.onPreExecute(); 

     // Create adapter for ListView (Universal Image Loader) 
     AngeboteListAdapter adapter = new AngeboteListAdapter(this, R.layout.angebote_list_view_adapter, dataList); 
     mListView.setAdapter(adapter); 

     Toast.makeText(AngeboteActivity.this,"onPostExecute",Toast.LENGTH_LONG).show(); 
    } 

和我在doInBackground QueryResult中:

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

這裏是所有代碼:

public class MultiplyTask extends AsyncTask<String,Void,ArrayList<Artikel>>{ 

    private class QueryResult { 
     ArrayList<Artikel> dataList; 

     public QueryResult(ArrayList<Artikel> dataList) { 
      this.dataList = dataList ; 
     } 
    } 

    @Override 
    protected void onPreExecute(){ 
     super.onPreExecute(); 
    } 
    @Override 
    protected void onPostExecute(String s){ 
     //super.onPreExecute(); 

     // Create Adapter for ListView (UniversalImageLoader) 
     AngeboteListAdapter adapter = new AngeboteListAdapter(this, R.layout.angebote_list_view_adapter, dataList); 
     mListView.setAdapter(adapter); 

     Toast.makeText(AngeboteActivity.this,"onPostExecute",Toast.LENGTH_LONG).show(); 
    } 


    String data =""; 

    @Override 
    protected QueryResult doInBackground(String... params){ 
     try 
     { 
     URL url = new URL("https://myjson.com"); 
     HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
     InputStream inputStream = httpURLConnection.getInputStream(); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     String line = ""; 
     while(line != null){ 
       line = bufferedReader.readLine(); 
       data = data + line; 
     } 
     ArrayList<String> listdata = new ArrayList<>(); 
     JSONArray jArray = new JSONArray(data); 
     for(int i =0 ;i <jArray.length(); i++){ 
      listdata.add(jArray.getString(i)); 
     } 

      JSONArray json = new JSONArray(data); 
      String[][] matrix = new String[json.length()][5]; 


     //Fill Array with response 
     for (int i=0; i < json.length(); i++) { 
      JSONObject obj = json.getJSONObject(i); 
      matrix[i][0] = String.valueOf(obj.getInt("Artikelnummer")); 
      matrix[i][1] = String.valueOf(obj.getDouble("Preis")); 
      matrix[i][2] = obj.getString("Von"); 
      matrix[i][3] = obj.getString("Bis"); 
      matrix[i][4] = obj.getString("art_link"); 
     } 



      //new Arrays 
      String[] all_art_nr = new String[matrix.length]; 
      String[] all_preis = new String[matrix.length]; 
      String[] all_von = new String[matrix.length]; 
      String[] all_bis = new String[matrix.length]; 
      String[] all_link = new String[matrix.length]; 


      //Array sort 
      for (int i = 0; i < matrix.length; i++) { 
       all_art_nr[i] = matrix[i][0]; 
       all_preis[i] = matrix[i][1]; 
       all_von[i] = matrix[i][2]; 
       all_bis[i] = matrix[i][3]; 
       all_link[i] = matrix[i][4]; 
      } 



      //Fill Arraylist 
      ArrayList<Artikel> dataList = new ArrayList<>(); 
      for (int i = 0; i < matrix.length; i++) { 
       Artikel angebote = new Artikel(all_art_nr[i], all_preis[i], all_von[i], all_bis[i], all_link[i]); 
       dataList.add(angebote); 
      } 


      return new QueryResult(dataList); 


    } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    return null; 
    } 

} 

Android Studio中要將QueryResult更改爲Arraylist,並且@Override不會從他的supercla覆蓋方法ss,如果我把QueryResult放在doINBackground中,他可以覆蓋超類的方法。提前致謝。

回答

1

當你延伸的AsyncTask檢查參數extends Asynctask<Params, Progress, Result>

所以,如果你想要一個字符串傳遞給你的doInBackround將返回一個QueryResult中onPostExecute你應該像這樣擴展: extends Asynctask<String, Void, QueryResult>

+0

離開文檔鏈接點擊這裏瞭解更多詳情:https://developer.android.com/reference/android/os/AsyncTask.html(檢查的AsyncTask的一般類型節) – Luis

+0

你好,THX你的答案,我已經嘗試過這種方式,但沒有工作。 – user8800556

+0

你應該嘗試刪除你的所有功能,正確地擴展你的類,然後實現這些方法,它將工作 –

0

爲什麼這個不工作?

private class QueryResult { 
    ArrayList<Artikel> dataList; 

    public QueryResult(ArrayList<Artikel> dataList) { 
     this.dataList = dataList ; 
    } 
} 



public class loadAngebote extends AsyncTask<String, Void, ArrayList<Artikel>>{ 

    String data =""; 

    @Override 
    protected ArrayList<Artikel> doInBackground(String... params){ 

     try 
     { 
      URL url = new URL("https://api.myjson.com/bins/1dnrmf"); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
      InputStream inputStream = httpURLConnection.getInputStream(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      String line = ""; 
      while(line != null){ 
       line = bufferedReader.readLine(); 
       data = data + line; 
      } 
      ArrayList<String> listdata = new ArrayList<>(); 
      JSONArray jArray = new JSONArray(data); 
      for(int i =0 ;i <jArray.length(); i++){ 
       listdata.add(jArray.getString(i)); 
      } 

      JSONArray json = new JSONArray(data); 
      String[][] matrix = new String[json.length()][5]; 

      //Array mit Response füllen 
      for (int i=0; i < json.length(); i++) { 
       JSONObject obj = json.getJSONObject(i); 
       matrix[i][0] = String.valueOf(obj.getInt("Artikelnummer")); 
       matrix[i][1] = String.valueOf(obj.getDouble("Preis")); 
       matrix[i][2] = obj.getString("Von"); 
       matrix[i][3] = obj.getString("Bis"); 
       matrix[i][4] = obj.getString("art_link"); 
      } 

      //Neue Arrays inizializieren 
      String[] all_art_nr = new String[matrix.length]; 
      String[] all_preis = new String[matrix.length]; 
      String[] all_von = new String[matrix.length]; 
      String[] all_bis = new String[matrix.length]; 
      String[] all_link = new String[matrix.length]; 


      //Array umsotieren und befüllen 
      for (int i = 0; i < matrix.length; i++) { 
       all_art_nr[i] = matrix[i][0]; 
       all_preis[i] = matrix[i][1]; 
       all_von[i] = matrix[i][2]; 
       all_bis[i] = matrix[i][3]; 
       all_link[i] = matrix[i][4]; 
      } 

      //String in Arraylist vom Typ Artikel einfügen 
      ArrayList<Artikel> dataList = new ArrayList<>(); 
      //ArrayList<Artikel> passed = passing[0]; //get passed arraylist 
      for (int i = 0; i < matrix.length; i++) { 
       Artikel angebote = new Artikel(all_art_nr[i], all_preis[i], all_von[i], all_bis[i], all_link[i]); 
       dataList.add(angebote); 
      } 

      return new QueryResult(dataList); 




     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 



     return null; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<Artikel> QueryResult){ 
     //super.onPreExecute(); 

     TextView txt = (TextView) findViewById(R.id.data); 
     txt.setText("Executed"); // txt.setText(result); 
     // Adapter erstellen und dem ListView übergeben 
     AngeboteListAdapter adapter = new AngeboteListAdapter(this, R.layout.angebote_list_view_adapter, dataList); 
     mListView.setAdapter(adapter); 
     Toast.makeText(AngeboteActivity.this,"onPostExecute Methode ausgeführt",Toast.LENGTH_LONG).show(); 


    } 

} 
相關問題