RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 774811
Accepted
Pavel Zlotarenchuk
Pavel Zlotarenchuk
Asked:2020-01-24 05:49:26 +0000 UTC2020-01-24 05:49:26 +0000 UTC 2020-01-24 05:49:26 +0000 UTC

如何从服务获取数据到类

  • 772

有一个接收片段数据的类

package tanat.androidtesttask.utils;

import android.content.Context;
import java.util.ArrayList;
import tanat.androidtesttask.activity.MainActivity;

public class LoadAllData {

    private final Context context;

    public LoadAllData(Context context) {
        this.context = context;
    }

    public ArrayList loadDemoData (Context context, int numberOfDownloads){
        String jsonStr = "";

        if (numberOfDownloads == 0) {
            jsonStr = loadLocalData(context);
            //делаем проверку на наличие локальной базы
            if (jsonStr == null || jsonStr.equals("")) {
                jsonStr = loadInetData();
            }
        } else {
            jsonStr = loadInetData();
        }

        ArrayList demoData = new JSONParsing().examineJSONDemoString(jsonStr);
        return demoData;
    }

    public String loadLocalData (Context context) {
        LoadLocalData loadLocalData;
        loadLocalData = new LoadLocalData(context);
        return loadLocalData.readFile();
    }

    public void pullLocalData (Context context, String localJsonStr) {
        LoadLocalData loadLocalData;
        loadLocalData = new LoadLocalData(context);
        loadLocalData.writeFile(localJsonStr);
    }

    public String loadInetData (){
        return MainActivity.loadData();
    }
}

但问题是通过 MainActivity.loadData() 的 loadInetData 方法加载数据没有正确实现(我什至会说 bydlocode)。此方法应从应用程序启动后立即创建的服务接收数据,并以流的形式从网络加载数据,并且片段应在数据加载期间旋转进度对话框。但我无法在第二天实施。

片段代码:package tanat.androidtesttask.fragments;

import android.app.DialogFragment;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;

import tanat.androidtesttask.activity.InfoRoutActivity;
import tanat.androidtesttask.activity.MainActivity;
import tanat.androidtesttask.R;
import tanat.androidtesttask.service.ConectService;
import tanat.androidtesttask.service.TestService;
import tanat.androidtesttask.utils.LoadAllData;

public class ListFragment extends android.app.ListFragment implements SwipeRefreshLayout.OnRefreshListener{

    // unbilder для роботы butterknife с фрагментом

    private View rootView;
    private DialogFragment dialogFragment;

    @BindView(R.id.refresh) SwipeRefreshLayout swipeRefreshLayout;
    @BindView(R.id.standart_layout) LinearLayout contentLayout;
    @BindView(R.id.error_layout) LinearLayout errorLayout;
    @BindView(R.id.errorTextView) TextView errorTextView;

    //кнопка для обновления в случае ошибки
    @OnClick(R.id.refreshButton)
    void onRefreshClick() {
        onRefresh();
    }

    //подключаем мой фрагмент
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_item, null);
        ButterKnife.bind(this, rootView);

        dialogFragment = new AlterDialog();
        swipeRefreshLayout.setOnRefreshListener(this);

        return rootView;
    }

    private ArrayList data = null;

    @Override
    public void onStart() {
        super.onStart();
        onRefresh();
    }

    //вешаем слушатель на нажатие итема фрагмента
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        //передаем позицию елемента в второе активити
        //создаем интент
        Intent intent = new Intent(ListFragment.this.getContext(), InfoRoutActivity.class);
        //записываем в него ключ и позицию
        intent.putExtra("position", position);
        //передаем
        startActivity(intent);
    }

    int numberOfDownloads = 0;

    //свайп вниз для обновления
    @Override
    public void onRefresh() {
        // начинаем показывать прогресс
        swipeRefreshLayout.setRefreshing(true);

        // вызываем загрузку данных 
        LoadAllData loadAllData = new LoadAllData(getActivity());
        data = loadAllData.loadDemoData(getActivity(), numberOfDownloads);

        numberOfDownloads++;

        if(data.size() > 0){
            // данные для списка есть
            // теперь проверим правильно ли была выполнена сетевая операция
            if(data.get(0).toString().equals("false")){
                // сетевая операция не прошла
                // меняем видимость layout так, что б не было видно рабочего layout и был виден
                // layout ошибки и вводим текст ошибки в textView
                contentLayout.setVisibility(View.INVISIBLE);
                errorLayout.setVisibility(View.VISIBLE);
                errorTextView.setText(data.get(1).toString());
            } else {
                //если сетевая операция прошла успешно
                errorLayout.setVisibility(View.INVISIBLE);
                contentLayout.setVisibility(View.VISIBLE);
                // создаем список
                createdList();
            }
        } else {
            //если данных списка нету
            errorLayout.setVisibility(View.INVISIBLE);
            contentLayout.setVisibility(View.VISIBLE);
            // создаем список (ListFragment автоматически выведет заданое сообщение)
            createdList();
        }

        // прячем прогресс
        swipeRefreshLayout.postDelayed(new Runnable() {
            @Override
            public void run() {
                swipeRefreshLayout.setRefreshing(false);
                //либо используем наш класс
        //        dialogFragment.dismiss();
            }
        }, 300);
    }

    private ArrayAdapter<String> adapter;

    // метод создание списка
    public void createdList(){
        adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, data);
        setListAdapter(adapter);
    }
}

服务代码:

package tanat.androidtesttask.service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutionException;

public class ConectService extends Service {

    final String LOG_TAG = "MyLog";
    private static Context context;

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    public void onCreate() {
        super.onCreate();
        Log.d(LOG_TAG, "onCreate");
    }

    private final IBinder binder = new LocalBinder();
    private static String inetJsonStr = "";

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "onStartCommand");
        someTask();
        return super.onStartCommand(intent, flags, startId);
    }

    public void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
    }

    public void someTask() {
        GetTask getTask = new GetTask();
        getTask.execute();
        try {
            inetJsonStr = getTask.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    public String getInetJsonStr() {
        if (inetJsonStr.equals("")){

            return null;
        } else {
            return inetJsonStr;
        }
    }

    public class LocalBinder extends Binder {
        public ConectService getService() {
            return ConectService.this;
        }
    }

    private class GetTask extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... params) {
            String strJson = "";
            InputStream inputStream;

            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;

            // получаем данные с внешнего ресурса и переделываем в строку
            try {
                URL url = new URL("http://projects.gmoby.org/web/index.php/api/trips?from_date=2016-01-01&to_date=2018-03-01");

                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                inputStream = url.openConnection().getInputStream();
                StringBuffer buffer = new StringBuffer();
                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }
                Log.d(LOG_TAG, "strJson not null");
                strJson = buffer.toString();
            } catch (Exception e) {
                e.printStackTrace();
                strJson = e.getMessage();
                Log.d(LOG_TAG, strJson);
            }

            return strJson;
        }
    }
}

这项任务显然不是一件容易的事,我真的希望会有人为此想破脑袋(我已经破了我的)。链接到git 在此先感谢。

java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Barmaley
    2020-01-24T18:11:57Z2020-01-24T18:11:57Z

    解决此类问题的标准方法是所谓的。绑定服务

    从 proger 的角度来看,其本质是在启动Service时进行一些操作,以便最终获得到正在运行的服务实例的链接,然后可以将其用作常规 Java 对象,访问它一些数据:

    ConectService myConnectService;
    //бла-бла, связываем и проч.
    //***************
    myData=myConnectService.getSomeData();  //получаем данные из сервиса
    

    您已经在服务本身中编写了绑定代码,您只需要在片段中实现绑定调用或Activity(阅读文档 - 上面的链接)

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5