Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以JSON格式从服务器获取数据并对其进行解析_Java_Android_Json_Xml - Fatal编程技术网

Java 以JSON格式从服务器获取数据并对其进行解析

Java 以JSON格式从服务器获取数据并对其进行解析,java,android,json,xml,Java,Android,Json,Xml,我正在开发一款android应用程序,它可以从服务器上获取图像并下载它们,然后将它们插入GridView布局中。 我从中获取数据的服务器是电影数据库 假设向服务器发送一个特定的URL,如下所示 将使服务器向我发送最流行电影的海报(图像)流,然后我将解析JSON响应并在网格视图中显示图像 这是我的档案。。。。1) MainActivity.java public class MainActivity extends Activity { private static final String TA

我正在开发一款android应用程序,它可以从服务器上获取图像并下载它们,然后将它们插入GridView布局中。 我从中获取数据的服务器是电影数据库 假设向服务器发送一个特定的URL,如下所示 将使服务器向我发送最流行电影的海报(图像)流,然后我将解析JSON响应并在网格视图中显示图像 这是我的档案。。。。1) MainActivity.java

public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
private GridView mGridView;
private ProgressBar mProgressBar;
private ImageAdapter mGridAdapter;
private ArrayList<GridItem> mGridData;
private String FEED_URL = "http://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=2add2d45d1265781502d4d7c2f9f67c2";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mGridView = (GridView) findViewById(R.id.grid_view);
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
    mGridData = new ArrayList();
    mGridAdapter = new ImageAdapter(this, R.layout.grid_item, mGridData);
    mGridView.setAdapter(mGridAdapter);

    //Start download
    new AsyncHttpTask().execute(FEED_URL);
    mProgressBar.setVisibility(View.VISIBLE);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

//Downloading data asynchronously
public class AsyncHttpTask extends AsyncTask<String, Void, Integer> {

    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        try {
            // Create Apache HttpClient
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse httpResponse = httpclient.execute(new HttpGet(params[0]));
            int statusCode = httpResponse.getStatusLine().getStatusCode();

            // 200 represents HTTP OK
            if (statusCode == 200) {
                String response = streamToString(httpResponse.getEntity().getContent());
                parseResult(response);
                result = 1; // Successful
            } else {
                result = 0; //"Failed
            }
        } catch (Exception e) {
            Log.d(TAG, e.getLocalizedMessage());
        }

        return result;
    }

    @Override
    protected void onPostExecute(Integer result) {
        // Download complete. Lets update UI

        if (result == 1) {
            mGridAdapter.setGridData(mGridData);
        } else {
            Toast.makeText(MainActivity.this, "network error", Toast.LENGTH_SHORT).show();
        }

        //Hide progressbar
        mProgressBar.setVisibility(View.GONE);
    }
}

String streamToString(InputStream stream) throws IOException {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
    String line;
    String result = "";
    while ((line = bufferedReader.readLine()) != null) {
        result += line;
    }

    // Close stream
    if (null != stream) {
        stream.close();
    }
    return result;
}

/**
 * Parsing the feed results and get the list
 *
        * @param result
*/
private void parseResult(String result) {
    try {
        JSONObject response = new JSONObject(result);
        JSONArray posts = response.optJSONArray("posts");
        GridItem item;
        for (int i = 0; i < posts.length(); i++) {
            JSONObject post = posts.optJSONObject(i);
            item = new GridItem();
            JSONArray attachments = post.getJSONArray("attachments");
            if (null != attachments && attachments.length() > 0) {
                JSONObject attachment = attachments.getJSONObject(0);
                if (attachment != null)
                    item.setImage(attachment.getString("url"));
            }
            mGridData.add(item);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}}
3) ImageAdapter.java

public class ImageAdapter extends ArrayAdapter<GridItem> {

private Context mContext;
private int layoutResourceId;
private ArrayList<GridItem> mGridData = new ArrayList<GridItem>();

public ImageAdapter(Context mContext, int layoutResourceId, ArrayList<GridItem> mGridData) {
    super(mContext, layoutResourceId, mGridData);
    this.layoutResourceId = layoutResourceId;
    this.mContext = mContext;
    this.mGridData = mGridData;
}

public void setGridData(ArrayList<GridItem> mGridData) {
    this.mGridData = mGridData;
    notifyDataSetChanged();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ViewHolder holder;

    if (row == null) {
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.imageView = (ImageView) row.findViewById(R.id.grid_item_image);
        row.setTag(holder);
    } else {
        holder = (ViewHolder) row.getTag();
    }

    GridItem item = mGridData.get(position);
    Picasso.with(mContext).load(item.getImage()).into(holder.imageView);
    return row;
}

static class ViewHolder {
    ImageView imageView;
}}
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
在java.lang.Thread.run(Thread.java:841)上试试这个

在gradle文件中添加图像加载程序库

编译'com.github.bumptech.glide:glide:3.6.1'

MainActivity.java

public class MainActivity extends AppCompatActivity {
private List<GridItem> gridItems;
private GridView gridView;
private ProgressBar progressBar;
private GridAdapter adapter;
protected Calendar calendar;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    calendar = Calendar.getInstance();
    init();
    getValue();
}

private void getValue() {
    progressBar.setVisibility(View.VISIBLE);
    HashMap<String, String> param = new HashMap<>();
    new NetworkRequest(MainActivity.this, new NetworkRequest.CallbackInterface() {
        @Override
        public void onRequestSuccess(JSONObject jsonObject) {
            progressBar.setVisibility(View.GONE);
            try {
                gridItems = new ArrayList<GridItem>();
                JSONArray result = jsonObject.getJSONArray("results");
                for (int i = 0; i < result.length(); i++) {
                    GridItem item = new GridItem();
                    item.setImageUrl(result.getJSONObject(i).getString("poster_path"));
                    gridItems.add(item);
                }
                adapter = new GridAdapter(getApplicationContext(), gridItems);
                gridView.setAdapter(adapter);

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

        @Override
        public void onRequestFailed(NetworkRequest.ErrorType errorType) {
            progressBar.setVisibility(View.GONE);
        }
    }, param, "GET").execute();
}


private void init() {
    gridView = (GridView) findViewById(R.id.grid);
    progressBar = (ProgressBar) findViewById(R.id.progress_bar);
}
}
public class GridAdapter extends ArrayAdapter<GridItem> {

private Context context;
private List<GridItem> gridItems;
private LayoutInflater inflater;

public GridAdapter(Context context, List<GridItem> contacts) {
    super(context, R.layout.grid_row, contacts);
    this.gridItems = contacts;
    this.context = context;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    ViewHolder viewHolder = new ViewHolder();
    if (convertView == null) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.grid_row, parent, false);
    } else {
        view = convertView;
    }
    viewHolder.imageView = (ImageView) view.findViewById(R.id.image);
    String url = gridItems.get(position).getImageUrl();
    if (url != null) {
        Glide.with(context).load(url).placeholder(R.drawable.dummy_icon).error(R.drawable.dummy_icon).into(viewHolder.imageView);
    }
    return view;
}

public class ViewHolder {
    ImageView imageView;
}
}
public class GridItem {
private String imageUrl;

public String getImageUrl() {
    return imageUrl;
}

public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}
}

确保您的图像路径为url

我找到了答案,问题不在代码中,而是在电影数据库API中,要从服务器正确获取图像,必须在解析数据之前将此URL“”添加到主URL中

    private void parseResult(String result) {
    try {
        JSONObject response = new JSONObject(result);
        JSONArray posters = response.optJSONArray("results");
        GridItem item;
        for (int i = 0; i < posters.length(); i++) {
            JSONObject poster = posters.optJSONObject(i);
            item = new GridItem();
            item.setImage("http://image.tmdb.org/t/p/w185/"+poster.getString("poster_path"));
            item.setOverview(poster.getString("overview"));
            item.setMovie_title(poster.getString("title"));
            item.setRelease_date(poster.getString("release_date"));
            item.setRating(poster.getString("vote_average"));
            mGridData.add(item);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
private void parseResult(字符串结果){
试一试{
JSONObject响应=新JSONObject(结果);
JSONArray posters=response.optJSONArray(“结果”);
网格项目;
对于(int i=0;i
你能添加完整的错误日志吗?在问题文本中发布你的API密钥可能不是一个好主意。请发布你得到的错误代码,以便我们能够解决。你的回答中没有带有密钥的JSONArray
posts
。好的,我将更新问题我已经在使用毕加索库将图像兑现到我的应用程序中
03-24 14:51:05.074    5099-5145/com.example.android.movieguide E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.example.android.movieguide, PID: 5099
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)
 Caused by: java.lang.NullPointerException: println needs a message
        at android.util.Log.println_native(Native Method)
        at android.util.Log.d(Log.java:158)
        at com.example.android.movieguide.MainActivity$AsyncHttpTask.doInBackground(MainActivity.java:91)
        at com.example.android.movieguide.MainActivity$AsyncHttpTask.doInBackground(MainActivity.java:71)
        at android.os.AsyncTask$2.call(AsyncTask.java:288)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
public class MainActivity extends AppCompatActivity {
private List<GridItem> gridItems;
private GridView gridView;
private ProgressBar progressBar;
private GridAdapter adapter;
protected Calendar calendar;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    calendar = Calendar.getInstance();
    init();
    getValue();
}

private void getValue() {
    progressBar.setVisibility(View.VISIBLE);
    HashMap<String, String> param = new HashMap<>();
    new NetworkRequest(MainActivity.this, new NetworkRequest.CallbackInterface() {
        @Override
        public void onRequestSuccess(JSONObject jsonObject) {
            progressBar.setVisibility(View.GONE);
            try {
                gridItems = new ArrayList<GridItem>();
                JSONArray result = jsonObject.getJSONArray("results");
                for (int i = 0; i < result.length(); i++) {
                    GridItem item = new GridItem();
                    item.setImageUrl(result.getJSONObject(i).getString("poster_path"));
                    gridItems.add(item);
                }
                adapter = new GridAdapter(getApplicationContext(), gridItems);
                gridView.setAdapter(adapter);

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

        @Override
        public void onRequestFailed(NetworkRequest.ErrorType errorType) {
            progressBar.setVisibility(View.GONE);
        }
    }, param, "GET").execute();
}


private void init() {
    gridView = (GridView) findViewById(R.id.grid);
    progressBar = (ProgressBar) findViewById(R.id.progress_bar);
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<GridView
    android:id="@+id/grid"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:columnWidth="100dp"
    android:drawSelectorOnTop="true"
    android:focusable="true"
    android:gravity="center"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth"
    android:verticalSpacing="5dp" />


<ProgressBar
    android:id="@+id/progress_bar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="gone" />

</RelativeLayout>
public class GridAdapter extends ArrayAdapter<GridItem> {

private Context context;
private List<GridItem> gridItems;
private LayoutInflater inflater;

public GridAdapter(Context context, List<GridItem> contacts) {
    super(context, R.layout.grid_row, contacts);
    this.gridItems = contacts;
    this.context = context;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    ViewHolder viewHolder = new ViewHolder();
    if (convertView == null) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.grid_row, parent, false);
    } else {
        view = convertView;
    }
    viewHolder.imageView = (ImageView) view.findViewById(R.id.image);
    String url = gridItems.get(position).getImageUrl();
    if (url != null) {
        Glide.with(context).load(url).placeholder(R.drawable.dummy_icon).error(R.drawable.dummy_icon).into(viewHolder.imageView);
    }
    return view;
}

public class ViewHolder {
    ImageView imageView;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FFF"
android:padding="8dp"
android:orientation="horizontal">

<ImageView
    android:id="@+id/image"
    android:layout_width="150dp"
    android:layout_height="150dp" />

</LinearLayout>
public class GridItem {
private String imageUrl;

public String getImageUrl() {
    return imageUrl;
}

public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}
}
    private void parseResult(String result) {
    try {
        JSONObject response = new JSONObject(result);
        JSONArray posters = response.optJSONArray("results");
        GridItem item;
        for (int i = 0; i < posters.length(); i++) {
            JSONObject poster = posters.optJSONObject(i);
            item = new GridItem();
            item.setImage("http://image.tmdb.org/t/p/w185/"+poster.getString("poster_path"));
            item.setOverview(poster.getString("overview"));
            item.setMovie_title(poster.getString("title"));
            item.setRelease_date(poster.getString("release_date"));
            item.setRating(poster.getString("vote_average"));
            mGridData.add(item);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}