【问题标题】:Getting an error trying to use an interface in an async task尝试在异步任务中使用接口时出错
【发布时间】:2014-02-17 02:34:38
【问题描述】:

我在这行遇到错误:

task.setOnArticleSelectedListener(this);

我得到的错误是:

setOnArticleSelectedListener
(com.beerportfolio.beerportfoliopro.PortfolioGetAllBeers.OnArticleSelectedListener)
in PortfolioGetAllBeers cannot be applied
to
(android.widget.AdapterView.OnItemSelectedListener)

该代码来自:

public class Portfolio extends Fragment implements PortfolioGetAllBeers.OnArticleSelectedListener {

    String beerId = "";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        //set layout here
        final View theLayout = inflater.inflate(R.layout.activity_portfolio, container, false);
        setHasOptionsMenu(true);
        getActivity().setTitle("Style");

        //get user information
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String userName = prefs.getString("userName", null);
        String userID = prefs.getString("userID", null);

        final Spinner portfolioType = (Spinner) theLayout.findViewById(R.id.portfolioSpinner);
        portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {


            @Override
            public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

                String portfolioChoice = portfolioType.getSelectedItem().toString();


                Log.d("portfolio", portfolioChoice);

                if( portfolioChoice.equals("All")){


                    //todo: clear second spinner
                    LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout);
                    ll.removeAllViews();

                    //get userID
                    //get user data
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                    String userID = prefs.getString("userID", null);

                    //construct url
                    String url = "myURL";


                    //async task goes here
                    PortfolioGetAllBeers task = new PortfolioGetAllBeers(getActivity());
                    task.setOnArticleSelectedListener(this);
                    task.execute(url);

                }

                else if (portfolioChoice.equals("Brewery")){

                    LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout);
                    ll.removeAllViews();
                    LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE);
                    View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner
                    Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2
                    ll.addView(v); // add the view to the linear layout

                    //todo: get breweries and fill spinner
                    //get userID
                    //get user data
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                    String userID = prefs.getString("userID", null);

                    //construct url
                    String url = "myURL2";


                    //async task goes here
                    new PortfolioGetAllBreweries(selectedItemView.getContext()).execute(url);

                }


                else if (portfolioChoice.equals("Style")){

                    LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout);
                    ll.removeAllViews();
                    LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE);
                    View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner
                    Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2
                    ll.addView(v); // add the view to the linear layout

                    //get userID
                    //get user data
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                    String userID = prefs.getString("userID", null);

                    //construct url
                    String url = "http://beerportfolio.com/app_getAllYourStyles.php?u=" + userID;


                    //todo: async task goes here

                    new PortfolioGetAllStyles(selectedItemView.getContext()).execute(url);

                }

                else if (portfolioChoice.equals("Rating")){

                    LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout);
                    ll.removeAllViews();
                    LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE);
                    View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner
                    Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2
                    ll.addView(v); // add the view to the linear layout

                    //get userID
                    //get user data
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                    String userID = prefs.getString("userID", null);

                    //make array

                    //make array list for beer
                    final List<String> tasteList = new ArrayList<String>();
                    tasteList.add("1");
                    tasteList.add("2");
                    tasteList.add("3");
                    tasteList.add("4");
                    tasteList.add("5");

                    // Selection of the spinner
                    Spinner spinner = (Spinner) theLayout.findViewById(R.id.portfolioSpinner2);

                    // Application of the Array to the Spinner
                    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(selectedItemView.getContext(),   android.R.layout.simple_spinner_item,tasteList );
                    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view
                    spinner.setAdapter(spinnerArrayAdapter);



                    //todo: add on select for spinner 2
//add on item selected
                    final Spinner portfolioType = (Spinner) theLayout.findViewById(R.id.portfolioSpinner2);
                    portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {


                        @Override
                        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

                            String portfolioChoice = portfolioType.getSelectedItem().toString();

                            //Toast.makeText(((Activity) c).getApplicationContext(), portfolioChoice, Toast.LENGTH_LONG).show();
                            final ListView lv = (ListView) theLayout.findViewById(R.id.allYourBeersList);
                            lv.setAdapter(null);

                            //get brewery beers
                            //get userID
                            //get user data
                            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                            String userID = prefs.getString("userID", null);



                            try {

                                portfolioChoice = URLEncoder.encode(portfolioChoice, "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }

                            //construct url
                            String url = "myURL3";

                            Log.d("portfolio" , url);
                            //async task goes here
                            new PortfolioGetAllBeers(selectedItemView.getContext()).execute(url);

                        }



                        @Override
                        public void onNothingSelected(AdapterView<?> parentView) {
                            // do nothing
                        }

                    });




                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parentView) {
                // do nothing
            }

        });






        // Inflate the layout for this fragment
        return theLayout;

    }

    @Override
    public void onArticleSelected(String bID, String brewery){

        //code to execute on click
        Fragment Fragment_one;
        FragmentManager man= getFragmentManager();
        FragmentTransaction tran = man.beginTransaction();
        Fragment_one = new BeerPage();
        final Bundle bundle = new Bundle();
        bundle.putString("beerIDSent", bID);
        bundle.putString("breweryIDSent", brewery);
        Fragment_one.setArguments(bundle);
        tran.replace(R.id.main, Fragment_one);//tran.
        tran.addToBackStack(null);
        tran.commit();

    }

}

那么异步任务代码为:

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

    Context c;
    private ProgressDialog Dialog;

    public PortfolioGetAllBeers (Context context)
    {
        c = context;
        Dialog = new ProgressDialog(c);
    }

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        return readJSONFeed(arg0[0]);
    }

    protected void onPreExecute() {
        Dialog.setMessage("Getting beers");

        Dialog.setTitle("Loading");
        Dialog.setCancelable(false);
        Dialog.show();
    }

    //***************************code for on click
    OnArticleSelectedListener listener;
    public interface OnArticleSelectedListener{
        public void onArticleSelected(String myString , String brewery);

    }
    public void setOnArticleSelectedListener(OnArticleSelectedListener listener){
        this.listener = listener;


    }
    //*****************************end code for onClick

    protected void onPostExecute(String result){
        //decode json here
        try{
            JSONArray jsonArray = new JSONArray(result);


            //acces listview
            ListView lv = (ListView) ((Activity) c).findViewById(R.id.allYourBeersList);

            //make array list for beer
            final List<ShortBeerInfo> tasteList = new ArrayList<ShortBeerInfo>();



            for(int i = 0; i < jsonArray.length(); i++) {

                String beer = jsonArray.getJSONObject(i).getString("beer");
                String rate = jsonArray.getJSONObject(i).getString("rate");
                String beerID = jsonArray.getJSONObject(i).getString("id");
                String bID = jsonArray.getJSONObject(i).getString("breweryID");


                //create object
                ShortBeerInfo tempTaste = new ShortBeerInfo(beer, rate, beerID, bID);

                //add to arraylist
                tasteList.add(tempTaste);
            }


            //add items to listview
            ShortBeerInfoAdapter adapter1 = new ShortBeerInfoAdapter(c ,R.layout.brewer_stats_listview, tasteList);
            lv.setAdapter(adapter1);

            //set up clicks
            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                                        int arg2, long arg3) {
                    ShortBeerInfo o=(ShortBeerInfo)arg0.getItemAtPosition(arg2);

                    String tempID = o.id;
                    String tempBrewID = o.brewery;


                    //todo: go to beer page
                    listener.onArticleSelected(tempID, tempBrewID);


                }
            });

        }
        catch(Exception e){

        }

        Dialog.dismiss();

    }

    public String readJSONFeed(String URL) {
        StringBuilder stringBuilder = new StringBuilder();
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(URL);
        try {
            HttpResponse response = httpClient.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                InputStream inputStream = entity.getContent();
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) != null) {
                    stringBuilder.append(line);
                }
                inputStream.close();
            } else {
                Log.d("JSON", "Failed to download file");
            }
        } catch (Exception e) {
            Log.d("readJSONFeed", e.getLocalizedMessage());
        }
        return stringBuilder.toString();
    }

}

更新代码:

public class Portfolio extends Fragment implements PortfolioGetAllBeers.OnArticleSelectedListener {

    String beerId = "";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        //set layout here
        final View theLayout = inflater.inflate(R.layout.activity_portfolio, container, false);
        setHasOptionsMenu(true);
        getActivity().setTitle("Style");

        //get user information
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String userName = prefs.getString("userName", null);
        String userID = prefs.getString("userID", null);

        final Spinner portfolioType = (Spinner) theLayout.findViewById(R.id.portfolioSpinner);
        portfolioType.OnArticleSelectedListener(new AdapterView.OnItemSelectedListener() {


            @Override
            public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

                String portfolioChoice = portfolioType.getSelectedItem().toString();


                Log.d("portfolio", portfolioChoice);

                if( portfolioChoice.equals("All")){


                    //todo: clear second spinner
                    LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout);
                    ll.removeAllViews();

                    //get userID
                    //get user data
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                    String userID = prefs.getString("userID", null);

                    //construct url
                    String url = "myURL";


                    //async task goes here
                    PortfolioGetAllBeers task = new PortfolioGetAllBeers(getActivity());
                    task.setOnArticleSelectedListener(this);
                    task.execute(url);

                }

                else if (portfolioChoice.equals("Brewery")){

                    LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout);
                    ll.removeAllViews();
                    LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE);
                    View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner
                    Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2
                    ll.addView(v); // add the view to the linear layout

                    //todo: get breweries and fill spinner
                    //get userID
                    //get user data
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                    String userID = prefs.getString("userID", null);

                    //construct url
                    String url = "myURL";


                    //async task goes here
                    new PortfolioGetAllBreweries(selectedItemView.getContext()).execute(url);

                }


                else if (portfolioChoice.equals("Style")){

                    LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout);
                    ll.removeAllViews();
                    LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE);
                    View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner
                    Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2
                    ll.addView(v); // add the view to the linear layout

                    //get userID
                    //get user data
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                    String userID = prefs.getString("userID", null);

                    //construct url
                    String url = "http://beerportfolio.com/app_getAllYourStyles.php?u=" + userID;


                    //todo: async task goes here

                    new PortfolioGetAllStyles(selectedItemView.getContext()).execute(url);

                }

                else if (portfolioChoice.equals("Rating")){

                    LinearLayout ll = (LinearLayout) theLayout.findViewById(R.id.addSpinnerLayout);
                    ll.removeAllViews();
                    LayoutInflater inflater = (LayoutInflater)selectedItemView.getContext().getSystemService(selectedItemView.getContext().LAYOUT_INFLATER_SERVICE);
                    View v = inflater.inflate(R.layout.addspinner_layout, null); // inflate addspinner
                    Spinner sp = (Spinner) v.findViewById(R.id.portfolioSpinner2); //portfolioSpinner2
                    ll.addView(v); // add the view to the linear layout

                    //get userID
                    //get user data
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                    String userID = prefs.getString("userID", null);

                    //make array

                    //make array list for beer
                    final List<String> tasteList = new ArrayList<String>();
                    tasteList.add("1");
                    tasteList.add("2");
                    tasteList.add("3");
                    tasteList.add("4");
                    tasteList.add("5");

                    // Selection of the spinner
                    Spinner spinner = (Spinner) theLayout.findViewById(R.id.portfolioSpinner2);

                    // Application of the Array to the Spinner
                    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(selectedItemView.getContext(),   android.R.layout.simple_spinner_item,tasteList );
                    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view
                    spinner.setAdapter(spinnerArrayAdapter);



                    //todo: add on select for spinner 2
//add on item selected
                    final Spinner portfolioType = (Spinner) theLayout.findViewById(R.id.portfolioSpinner2);
                    portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {


                        @Override
                        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

                            String portfolioChoice = portfolioType.getSelectedItem().toString();

                            //Toast.makeText(((Activity) c).getApplicationContext(), portfolioChoice, Toast.LENGTH_LONG).show();
                            final ListView lv = (ListView) theLayout.findViewById(R.id.allYourBeersList);
                            lv.setAdapter(null);

                            //get brewery beers
                            //get userID
                            //get user data
                            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(selectedItemView.getContext());
                            String userID = prefs.getString("userID", null);



                            try {

                                portfolioChoice = URLEncoder.encode(portfolioChoice, "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }

                            //construct url
                            String url = "myURL2";

                            Log.d("portfolio" , url);
                            //async task goes here
                            new PortfolioGetAllBeers(selectedItemView.getContext()).execute(url);

                        }



                        @Override
                        public void onNothingSelected(AdapterView<?> parentView) {
                            // do nothing
                        }

                    });




                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parentView) {
                // do nothing
            }

        });






        // Inflate the layout for this fragment
        return theLayout;

    }

    @Override
    public void onArticleSelected(String bID, String brewery){

        //code to execute on click
        Fragment Fragment_one;
        FragmentManager man= getFragmentManager();
        FragmentTransaction tran = man.beginTransaction();
        Fragment_one = new BeerPage();
        final Bundle bundle = new Bundle();
        bundle.putString("beerIDSent", bID);
        bundle.putString("breweryIDSent", brewery);
        Fragment_one.setArguments(bundle);
        tran.replace(R.id.main, Fragment_one);//tran.
        tran.addToBackStack(null);
        tran.commit();

    }

}

【问题讨论】:

  • 在您的活动和异步任务之间进行通信的最简单方法是创建一个接口,在其中添加您需要的方法,然后在 onPostExecute() 中,使用 try/catch 块调用它们。在活动中,实现接口并覆盖方法(而不是使用 setSOmeInterfaceListener)。希望对这里有所帮助。

标签: android android-asynctask


【解决方案1】:

快速解决方法是简单地更改这一行

task.setOnArticleSelectedListener(this);

task.setOnArticleSelectedListener(Portfolio.this);


解释:

您使用以下行实例化了 AdapterView.OnItemSelectedListener 的内联定义

portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {...}

因此,当您调用 setOnArticleSelectedListener() 时,您是在此内联类定义中执行此操作。因此,编译器不会将“this”理解为 Portfolio 的当前实例,而是将其理解为 AdapterView.OnItemSelectedListener 的当前实例。但是内联定义可以访问封闭的 Portfolio 类及其成员。通过使用“Portfolio.this”,您可以告诉编译器使用此封闭类的当前实例。

【讨论】:

【解决方案2】:

您对PortfolioGetAllBeers 任务的实现有一个方法setOnArticleSelectedListener(),它将OnArticleSelectedListener 实例作为参数。

但是,在产生错误的那一行中,您传递了一个 AdapterView.OnItemSelectedListener 类型的对象:

这是您正在创建这种类型的侦听器的一行:

portfolioType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { ...

然后在你调用的这个范围内:

PortfolioGetAllBeers task = new PortfolioGetAllBeers(getActivity());
task.setOnArticleSelectedListener(this);

在此范围内,this 指的是 AdapterView.OnItemSelectedListener 对象,这不是您的任务所期望的。根据您的代码,您似乎希望您的任务回调到 Portfolio 片段,因为它是实现侦听器接口的回调方法的片段。

因此,向编译器指示您希望 this 表示 Portfolio 实例的方法是这样编写:

task.setOnArticleSelectedListener(Portfolio.this);

现在您将正确的对象实例传递给您的任务。

【讨论】:

  • 将该行从 setONItemSelectedLIstener 更改为 OnArticleSelectedListened,现在我得到:无法解析方法 'OnArticleSelectedListener(android.widget.AdapterView.OnItemSelectedListener)
  • 我想你可能改错了行。您在 Spinner 对象上调用 OnArticleSelectedListener(),该对象没有该方法。它有一个名为setOnItemSelectedListener() 的方法。我将用更多细节更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多