使用RecyclerAdapter中的Async任务时出错

时间:2017-02-16 02:29:57

标签: java android android-studio

我试图从我的RecyclerAdapter使用异步任务,但出于某种原因,我收到了这个错误:" java.lang.NullPointerException:尝试调用虚方法' android.view.View android.view.View.findViewById(int)'在null对象引用"。

这是我的代码:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    Context c;
    ImageView img;
    View view;



    private String[] titles = {"One",
            "Two",
            "Three",
            "Four",
            "Five",
            "Six",
            "Seven",
            "Eight"};

    class ViewHolder extends RecyclerView.ViewHolder{



        public TextView itemTitle;



        public ViewHolder(View itemView) {
            super(itemView);

            itemTitle = (TextView)itemView.findViewById(R.id.item_title);


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    int position = getAdapterPosition();

                    String urlString;
                    switch( position) {
                        case 0:
                            Intent i = new Intent(v.getContext(),DisplayPicture.class);
                            v.getContext().startActivity(i);
                            urlString = "http://image-cdn.neatoshop.com/styleimg/36217/none/black/default/301347-19.jpg?v=b";
                            break;
                        case 1:
                            urlString = c.getResources().getString(R.string.chuck_http);
                            break;
                        case 2:
                            urlString = c.getResources().getString(R.string.app_name);
                            break;
                        case 3:
                            urlString = c.getResources().getString(R.string.mrt_http);
                            break;
                        case 4:
                            urlString = c.getResources().getString(R.string.faceman_http);
                            break;
                        case 5:
                            urlString = c.getResources().getString(R.string.knight_http);
                            break;
                        default:
                            urlString = c.getResources().getString(R.string.chuck_http);
                    }
                    new DownloadImageTask().execute(urlString);



                }
            });
        }
    }

    // Makes scrolling smooth
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.card_layout, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        viewHolder.itemTitle.setText(titles[i]);
    }

    @Override
    public int getItemCount() {
        return titles.length;
    }
    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        protected Bitmap doInBackground(String... urls) {
            return downloadImage(urls[0]);
        }
        protected  void onPostExecute(Bitmap bm) {

            img = (ImageView) view.findViewById(R.id.imageView);
            img.setImageBitmap(bm);
        }
    }

    private Bitmap downloadImage(String urlStr) {
        Bitmap bm = null;
        InputStream in = null;
        try {
            in = openHttpConnection(urlStr);
            bm = BitmapFactory.decodeStream(in);
            in.close();
        } catch (Exception ex) {
            Log.d("DL Image", ex.getLocalizedMessage());
        }
        return bm;
    }
    private InputStream openHttpConnection(String urlString) throws Exception {
        InputStream is = null;
        int res = -1;   // response
        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();
        if ( !(conn instanceof HttpURLConnection) ) {
            throw new IllegalArgumentException("Not an HttpURLConnection");
        }
        try {
            HttpURLConnection huc = (HttpURLConnection)conn;
            huc.setAllowUserInteraction(false);
            huc.setInstanceFollowRedirects(true);
            huc.setRequestMethod("GET");
            huc.connect();
            res = huc.getResponseCode();
            if ( res == HttpURLConnection.HTTP_OK ) {
                is = huc.getInputStream();
            }
        } catch ( Exception ex ) {
            Log.d("Networking", ex.getLocalizedMessage() );
            throw ex;
        }
        return is;
    }





}

card_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/card_view"
    android:layout_margin="5dp"
    card_view:cardBackgroundColor="#81C784"
    card_view:cardCornerRadius="12dp"
    card_view:cardElevation="3dp"
    card_view:contentPadding="4dp"
    android:foreground="?selectableItemBackground"
    android:clickable="true" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp" >


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/item_title"
            android:layout_alignParentTop="true"
            android:textSize="30sp"
            />


    </RelativeLayout>
</android.support.v7.widget.CardView>

3 个答案:

答案 0 :(得分:1)

在行中:

img = (ImageView) view.findViewById(R.id.imageView);

您可以访问变量视图,但在您的代码中,您永远不会设置它。 所以它是空的。

此外,AsyncTasks很难做到,当你的活动已经被杀死时它可能会完成。我建议阅读this answer given here

答案 1 :(得分:0)

我认为你没有理解我的观点。你的下载逻辑很好,但问题出在图像视图上。您正在尝试在开始活动(活动显示)之前设置图像视图,这是无法完成的。以下是您必须做的事情:

  1. 在onclick上启动您的活动显示活动。
  2. 显示活动开始后,执行下载逻辑。
  3. 使用下载的图像设置图像视图。

答案 2 :(得分:0)

这里的问题是您的代码正在您正在使用的card_layout.xml布局中查找imageView。您可以通过插入带有如下所示的imageView id的ImageView来解决此问题。从那里你可以修复你的布局。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/card_view"
    android:layout_margin="5dp"
    card_view:cardBackgroundColor="#81C784"
    card_view:cardCornerRadius="12dp"
    card_view:cardElevation="3dp"
    card_view:contentPadding="4dp"
    android:foreground="?selectableItemBackground"
    android:clickable="true" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp" >


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/item_title"
            android:layout_alignParentTop="true"
            android:textSize="30sp"
            />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitXY"
            android:id="@+id/imageView"/>


    </RelativeLayout>
</android.support.v7.widget.CardView>