欢迎来到爱游戏官方首页鲜果配送有限公司!

专注鲜果配送

新鲜 / 健康 / 便利 / 快速 / 放心

全国咨询热线020-88888888
爱游戏首页 - 爱游戏「AIYOUXI」官方网站

新闻中心

 

推荐产品

24小时服务热线 020-88888888

新闻中心

想开发自己的安卓新闻App?从零搭建客户端+服务器的完整攻略

发布日期:2025-12-16 02:52浏览次数:

有不少人期望拥有一个自身能够全然把控的新闻应用,然而在面对客户端以及服务器的开发的时候,却又认为技术门槛过高。

新闻平台的基本架构

存在着一个构成完整状态的新闻平台,它具体被划分成了客户端以及服务器这两个部分。服务器承担着将新闻数据开展存储操作,并且借由接口予以提供的职责工作;客户端致力于把承接过来的数据朝着用户呈现展示的任务。服务器通常会运用常见的Web技术体系,就类似于利用PHP或者Java编制形成接口那样。

客户端一般为手机应用,于2016年前后的移动互联网起始阶段,主要开拓平台是安卓,开发者得各自把控服务器端的数据处置以及客户端的界面研发技能,此乃构建整个体系必不可少之两个关键部分 。

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
-- Database: `newsdemo`
-- 表的结构 `news`
CREATE TABLE IF NOT EXISTS `news` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `title` text NOT NULL,
 `desc` text NOT NULL,

 `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `content_url` text NOT NULL,
 `pic_url` text NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
--
-- 转存表中的数据 `news`
--
INSERT INTO `news` (`id`, `title`, `desc`, `time`, `content_url`, `pic_url`) VALUES
(1, 'Oracle解锁封锁的账号', '我们在安装Oracle的时候最后一步有一个管理账户的,里边可以解锁所所需的账户', '2015-03-15 11:50:03', 'http://blog.csdn.net/xlgen157387/article/details/41595709', 'http://img.blog.csdn.net/20141129144613046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxnZW4xNTczODc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center'),
(2, 'Android程序之全国天气预报查询(聚合数据开发)', '项目演示效果如下: 项目源代码下载地址: 访问密码 2eac二、使用 聚合数据SDK:', '2015-03-15 11:50:13', 'http://blog.csdn.net/xlgen157387/article/details/44246119', 'http://img.blog.csdn.net/20150314095028546');

数据库的设计与搭建

数据库之中需要存储新闻数据。一般而言,会构建一张新闻表,表里面含有新闻标题、内容、发布时间、作者等关键字段。举例来讲,能够运用MySQL数据库去创建这张表。

当完成建表操作之后,便能够朝着其中录入新闻的相关内容 。这些数据构成了后续所有服务得以存在的基础。在数据库的选择方面具备相当大的灵活性,除去MySQL之外,依据项目自身的规模以及需求状况,还能够选用SQLite或者其他类型的关系型数据库 。

服务器端的数据接口开发

服务器得把数据库里头的新闻数据转成客户端能够识别的格式,针对挪动应用频繁使用的数据交换格式JSON ,因其具备轻量便捷且易于解析的特质,达成这般一个转换任务就需要一个用于服务器端的数据查询并转换的脚本来予以呈现,来得以实现。


就拿PHP来说,能够编写一个脚本,此脚本用于连接数据库,接着执行查询语句,随后借助json_encode函数把结果集封装成JSON字符串予以输出。而这个脚本是通过一个特定的URL地址也就是API接口来对外提供服务的。

客户端的网络数据请求

 $row['title'],
            "desc" => $row['desc'],
            "time" => $row['time'],
            "content_url" => $row['content_url'],
            "pic_url" => $row['pic_url']
          );
 }
 //数组转换为JSON字符串
 echo json_encode($arr);
?>

倘若处于Android客户端范畴之内,那么便需要借助网络请求库去访问上述提及的服务器接口地址。回溯至2016年阶段,经常被运用的库主要有HttpURLConnection或者Volley这两种。而应用在实际运行过程当中,必须于子线程里发起网络请求操作,目的在于防止阻塞主线程进而引致界面出现卡顿现象。

请求达成成功状态之后,便会接收到由服务器回返的呈JSON格式的字符串类数据。紧接着的具有关键性质的步骤,即为怎样将此字符串转变成为程序自身内部能够进行操作的数据对象,这也就是所谓的JSON解析 。

客户端的数据解析与展示

通常来讲,需要借助解析库来解析JSON数据,像Gson或者原生的JSONObject,解析完毕后就能够把数据映射到自定义的Java Bean类里,比如说一个叫News的类,它的属性对应着新闻的各项具体字段 。

当拿到结构化的新闻数据列表之后,有了这个前提,就能够去使用像ListView或者RecyclerView这类的列表控件来进行展示。借助自定义适配器,把每一条新闻数据绑定到列表的每一个item视图之上,凭借这样的方式,进而完成新闻列表的渲染。

项目的整合与要点总结

package com.xuliugen.news;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.xuliugen.news.adapter.NewsAdapter;
import com.xuliugen.news.model.News;
import com.xuliugen.news.utils.HttpUtils;
public class MainActivity extends Activity implements OnItemClickListener{
  private ListView lvNews;
  private NewsAdapter adapter;
  private List newsList;
  //此处需要修改为自己的服务器地址:也就是具体的服务器地址:这里不要写你的localhost或者127.0.0.1因为这是要在手机上运行的!
  public static final String GET_NEWS_URL = "http://172.23.252.89:8080/NewsDemo/getNewsJSON.php";
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lvNews = (ListView) findViewById(R.id.lvNews); //一条一条的消息展示消息
    newsList = new ArrayList(); //初始化
    adapter = new NewsAdapter(this, newsList); //也是初始化,会在后期执行getNewsJSON()方法之后更新
    lvNews.setAdapter(adapter); //设置构造器
    lvNews.setOnItemClickListener(this);
    //这里执行了网络的的请求操作
    HttpUtils.getNewsJSON(GET_NEWS_URL, getNewsHandler); //传入的一个handler对象
  }
  // 这里是访问网络数据的时候,返回的handler
  private Handler getNewsHandler = new Handler(){
      /**
       * 这个方法是Handler自带的方法,用于接受返回的数据
       */
      public void handleMessage(android.os.Message msg) {
        String jsonData = (String) msg.obj;
        System.out.println(jsonData);
        try {
          //下边是解析json
          JSONArray jsonArray = new JSONArray(jsonData);
          for (int i=0;i adapter, View view, int position, long arg3) {
    //获取被点击的对象
    News news = newsList.get(position); 
    Intent intent = new Intent(this, BrowseNewsActivity.class);
    intent.putExtra("content_url", news.getContent_url()); //根据被点击的对象,获取其url
    startActivity(intent);
  }
}

成功把服务器进行了部署,并且保证客户端能够正确地针对API开展访问之后,一款简简单单的新闻应用就已经形成了。整个的这个过程覆盖了从后端数据库的设计、API的编写,历经前端网络通信、数据解析以及界面绑定的一整套完整链条 。

package com.xuliugen.news.utils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
/**
 * 访问网络的工具类
 * 
 * @author xuliugen
 * 
 */
public class HttpUtils {
  public static void getNewsJSON(final String url, final Handler handler) {
    //要访问网络,开启一个线程
    new Thread(new Runnable() {
      @Override
      public void run() {
        HttpURLConnection conn;
        InputStream inputStream;
        try {
          conn = (HttpURLConnection) new URL(url).openConnection();
          conn.setRequestMethod("GET");
          inputStream = conn.getInputStream();
          BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
          String line = "";
          StringBuilder result = new StringBuilder(); //StringBuilder初始化不可以null
          while ((line = reader.readLine()) != null) {
            result.append(line);
          }
          //使用handler的话要使用Message
          Message msg = new Message();
          msg.obj = result.toString();
          // 通知主线程handler
          handler.sendMessage(msg);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
  }
  /**
   * 设置图片的信息
   * 
   * 在适配器里边调用
   * 
   * @param ivPic 需要设置的view组件
   * @param pic_url 图片的地址
   */
  public static void setPicBitmap(final ImageView ivPic, final String pic_url) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          HttpURLConnection conn = (HttpURLConnection) new URL(pic_url).openConnection();
          conn.connect();
          InputStream is = conn.getInputStream();
          Bitmap bitmap = BitmapFactory.decodeStream(is);
          ivPic.setImageBitmap(bitmap);
          is.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
  }
}

其里的技术关键所在有跨平台数据格式JSON的运用,对HTTP网络请求的领会,以及MVC/MVP等基础架构理念的践行。此个项目尽管基础,然而却包含了现代移动应用开发的核心流程 。

你以前有没有试过自己动手去搭建一个极为完整并且十分全面的应用呀,在这个过程当中遭遇到的最为巨大的挑战究竟是什么呢,热烈欢迎在评论区域去分享你自己那独特的经历以及内心深处的心得哟,要是你感觉这篇文章对你是有着一定帮助的话,同样也请你点赞给予支持呀。

package com.xuliugen.news.model;
/**
 * 与json数据相对应的bean
 * 
 * @author xuliugen
 * 
 */
public class News {
  private String title;
  private String desc;
  private String time;
  private String content_url;
  private String pic_url;
  /**
   * 全参的构造函数
   * 
   * @param title
   * @param desc
   * @param time
   * @param content_url
   * @param pic_url
   */
  public News(String title, String desc, String time, String content_url,
      String pic_url) {
    setTitle(title);
    setDesc(desc);
    setTime(time);
    setContent_url(content_url);
    setPic_url(pic_url);
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getDesc() {
    return desc;
  }
  public void setDesc(String desc) {
    this.desc = desc;
  }
  public String getTime() {
    return time;
  }
  public void setTime(String time) {
    this.time = time;
  }
  public String getContent_url() {
    return content_url;
  }
  public void setContent_url(String content_url) {
    this.content_url = content_url;
  }
  public String getPic_url() {
    return pic_url;
  }
  public void setPic_url(String pic_url) {
    this.pic_url = pic_url;
  }
}

020-88888888