2017-10-19 7 views
-2

Java 프로그래밍에 새로운 것이므로 질문이 있습니다. this 게시물을 발견하고이 메소드를 사용하여 doInBackground 메소드의 값을 onPostExecute 메소드에 전달하려고했습니다. 그러나 Android Studio 2.3에서는 허용하지 않습니다.Asynctask : doInBackground에서 onPostExecute로 값을 전달하십시오.

안드로이드 스튜디오 onPostExecute에서 내 @Override을 강조 :

@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을 :

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

} 

안드로이드 스튜디오가 원하는 :

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

모든 코드 QueryResult를 Arraylist로 바꾸고 @Override가 supercla의 메소드를 오버라이드하지 않습니다. ss, doINBackground에서 QueryResult를 꺼내면 수퍼 클래스 메서드를 재정의 할 수 있습니다. 미리 감사드립니다.

답변

1

당신 은 AsyncTask를 검사에게 매개 변수 확장 할 때 : 그래서 당신은 당신의 onPostExecuteQueryResult을 반환하는 당신의 doInBackround문자열를 전달하려면 extends Asynctask<Params, Progress, Result>

을 다음과 같이 확장해야합니다. extends Asynctask<String, Void, QueryResult>

+0

자세한 내용은 여기에 문서 링크를 떠나 : https://developer.android.com/reference/android/os/AsyncTask.html을 (AsyncTask를의 일반적인 유형 섹션을 확인) – Luis

+0

안녕하세요, 귀하의 답변을 들으, I 이미이 방법을 시도했지만 작동하지 않습니다. – 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(); 


    } 

}