【问题标题】:JSON parsing and getting images in androidandroid中的JSON解析和获取图像
【发布时间】:2016-09-10 04:03:26
【问题描述】:

我想解析包含字符串和图像的 JSON 对象。我的代码正在运行,但加载图像太慢了。我想用另一个异步任务或服务加载图像以减少加载时间。我怎样才能做到这一点?哪一种是使用 asynctask 或 service 的最佳方法?这是我的代码

public class Traffic extends Fragment {
private ListView listView;
private HttpURLConnection connection = null;
private BufferedReader bufferedReader = null;
private InputStream inputStream = null;
private ArrayList<TrafficModelClass> trafficList;
private TrafficAdapter trafficAdapter;
private View view;
private ProgressDialog progressDialog;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.traffic,container,false);
    listView = (ListView) view.findViewById(R.id.trafficListView);
    progressDialog = ProgressDialog.show(view.getContext(),"" ,"Wait..." , true);
    new GetTrafficNews().execute();
    trafficList = new ArrayList<TrafficModelClass>();
    trafficAdapter = new TrafficAdapter(view.getContext() , R.id.trafficListView , trafficList);
    listView.setAdapter(trafficAdapter);
    return view;
}
public class GetTrafficNews extends AsyncTask<String , Void , String> {


    @Override
    protected String doInBackground(String... params) {
        try {
            URL url = new URL("http://www.dtexeshop.com/Journalist/GetTrafficNews.php");
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoInput(true);
            inputStream = connection.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"));
            StringBuffer stringBuffer = new StringBuffer();
            String line="";

            while((line=bufferedReader.readLine()) != null){
                stringBuffer.append(line);
            }

            String finalJson = stringBuffer.toString();
            JSONObject parentJson = new JSONObject(finalJson);
            JSONArray parentJsonArray = parentJson.getJSONArray("traffic");

            for (int i = 0; i < parentJsonArray.length(); i++) {
                JSONObject finalJsonObject = parentJsonArray.getJSONObject(i);

                TrafficModelClass modelClass = new TrafficModelClass();
                modelClass.setUserName(finalJsonObject.getString("UserName"));
                modelClass.setDateTime(finalJsonObject.getString("DateTime"));
                modelClass.setHeadline(finalJsonObject.getString("Headline"));
                String string_url ="http://www.dtexeshop.com/Journalist/images/"+ finalJsonObject.getString("ImageName");
                URL urlImage = new URL(string_url);
                Bitmap image = BitmapFactory.decodeStream(urlImage.openConnection().getInputStream());
                modelClass.setBitmapImage(image);
                modelClass.setDescription(finalJsonObject.getString("Description"));

                trafficList.add(modelClass);
                if(i==1){
                    progressDialog.dismiss();
                }
            }
            inputStream.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }finally {
            if (connection != null) {
                connection.disconnect();
            }
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String s) {
        trafficAdapter.notifyDataSetChanged();
        progressDialog.dismiss();
    }
}

}

【问题讨论】:

    标签: android json listview service android-asynctask


    【解决方案1】:

    我建议你使用 picasso 库来获取图像,这对你来说是完美的。它不会延迟加载时间,它会根据网络加载图像。

    只需使用这行代码:

    Picasso.with(context).load("url").into(imageview);
    

    并将此依赖项添加到您的应用程序中。

    compile 'com.squareup.picasso:picasso:2.5.2'
    

    【讨论】:

      【解决方案2】:

      首先,你不应该在非 UI 线程中调用 progressDialog.dismiss(),所有对 UI 组件的操作都应该在 UI 线程中完成。在我看来,最常见和最现代的方法是使用 RxJava 框架执行此类操作。它允许你以函数式的方式非常容易地编写这样的算法。但是一旦你熟悉了它,你就不想停止使用它。我的解决方案如下所示:

      createDownloadObservable(url) // download json
          .map(json -> parseJson(json) // parse json text into a json object
          .map(jsonObject -> extractTrafficModel(jsonObject))) // extract list of TrafficModels from jsonObject
          .flatMap(trafficModelList -> Observable.from(trafficModelList)) // push every TrafficModel item in a pool
          .map(trafficModelItem -> downloadImage(trafficModelItem)) // download and set image for each TrafficModel item
          .toList() // aggreagate all items in a list
          .subscribe(new Subscriber() {
              public void onNext(List<TrafficModel> trafficModelList) {
                  // here you are! You can do what you want to with this traffic model list
              }
      
              public void onError(Throable e) {
                  // if some error appeared while passing the algorithm, you can process it here
              }
          })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-31
        • 2021-02-22
        • 2016-03-28
        • 1970-01-01
        • 2015-04-20
        • 2012-03-05
        • 2012-04-20
        • 2019-12-23
        相关资源
        最近更新 更多