尝试调用接口方法'java.lang.Object[] java.util.Collection.toArray()'

3
代码从网页获取JSON对象并将其转换为列表。在这里可能会出现异常,请帮我看看。
import android.content.Context;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;


public class FeedActivity extends Activity implements OnFeedListener{


ListView listview;
FeedAdapter adapter;
ArrayList<Post> posts;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_feed);

    listview = (ListView)findViewById(R.id.listView);


    //Data ->adapter -> ListView
    adapter = new FeedAdapter(getApplicationContext(),R.layout.layout_feed_item);


    listview.setAdapter(adapter);

    FeedTask task = new FeedTask(this);
    task.execute("https://public-api.wordpress.com/rest/v1.1/sites/androsiv.wordpress.com/posts/");
}

@Override
public void onFeed(JSONArray array) {
    int length = array.length();
    for(int i = 0; i<length; i++)
    {
        JSONObject object = array.optJSONObject(i);
         Post post = new Post(object.optString("title"),object.optString("excerpt"),object.optString("featured_image"));

        posts = new ArrayList<>();
        posts.add(post);
    }
    adapter.addAll(posts);
    adapter.notifyDataSetChanged();
}


public class FeedTask extends AsyncTask<String, Void, JSONArray>
{
    private OnFeedListener listener;
    public FeedTask(OnFeedListener listener)
    {
        this.listener = listener;
    }


    @Override
    protected JSONArray doInBackground(String... params) {
        String url = params[0];

        OkHttpClient client = new OkHttpClient();
        Request.Builder builder = new Request.Builder();

        Request request = builder.url(url).build();

        try {
            Response response = client.newCall(request).execute();
            String json = response.body().string();
            try {
                JSONObject object = new JSONObject(json);
                JSONArray array = object.optJSONArray("posts");
                return array;
            }
            catch(JSONException e)
                {
                    e.printStackTrace();
                }
         } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(JSONArray array) {
        super.onPostExecute(array);

        if(null == array)
           return;

        if(null != listener)
            listener.onFeed(array);
    }
}

public class FeedAdapter extends ArrayAdapter<Post>
{
    private int resource;
    public FeedAdapter(Context context, int resource) {
        super(context, resource);
        this.resource = resource;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(null == convertView)
        {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(resource,null);
        }
        //Binding data
        Post post = getItem(position);
        TextView title = (TextView) convertView.findViewById(R.id.title);
        TextView desc = (TextView) convertView.findViewById(R.id.description);

        title.setText(post.title);
        desc.setText(post.description);
        return convertView;
    }

}

public class Post
{
    public String title;
    public String description;
    public String thumbnail; //url

    public Post(String title, String desc, String thumbnail)
    {
        this.description=desc;
        this.thumbnail=thumbnail;
        this.title=title;
    }
}
}

以下是该程序的日志记录,遇到了空指针异常,请帮忙解决。在之前的类似问题中,我没有找到解释。 日志记录: 通过更改提到的行,我得到了以下异常:
 java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
FATAL EXCEPTION: AbstractCallbackSender
Process: jp.co.translimit.braindots, PID: 7444
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
 FATAL EXCEPTION: AsyncTask #5
Process: jp.co.translimit.braindots, PID: 8498
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
 java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
2个回答

3
问题在于这句话:
adapter.addAll(posts);

在您的onCreate方法中,posts尚未初始化,并且其值为NULL。您应该执行以下操作之一:
  1. 在使用posts之前对其进行初始化(posts = new ArrayList<Post>()
  2. 由于posts为空时addAll(posts)可能不会产生任何效果,因此可以完全跳过它。 您在onFeed方法中再次调用addAll(posts)

另外需要注意的是:我看到您在onFeed()方法中的循环中正在使用空数组重新初始化posts。那样做没有任何好处。您应该在循环之前初始化posts集合。

0

adapter.addAll(posts);

在没有初始化的情况下,您试图将其添加到适配器中。这里的posts ArrayList为空,而您正在asynctask中填充posts数组,该任务是在上述行之后启动的。删除上述行即可解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接