RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-280188

Pavel Zlotarenchuk's questions

Martin Hope
Pavel Zlotarenchuk
Asked: 2020-12-15 23:54:16 +0000 UTC

滚动列表ReactNative时如何禁用隐藏键盘

  • 0

我有一个列表(ListView),每个单元格都有一个 . 如果单击屏幕底部的 TextInput,则列表会滚动,以使元素位于键盘上方并且键盘打开,然后立即关闭(问题一),但是如果将光标放在列表的最后一个元素,然后在关闭键盘后,列表也会向后滚动,事实证明根本无法向其中输入数据。请帮忙,提前谢谢

编码:

renderCell(rowData, rowID) {
        return (
            <View style={styles.measurement}>
                <Image style={styles.image}
                       source={{uri: rowData.picture}}/>
                <View style={{margin: 10}}>
                    <Text style={styles.text}>{this.getName(rowData)}</Text>
                    <TextInput style={{marginTop: 4, height: 40, borderWidth: 1, fontSize: 14, alignSelf: 'flex-start'}}
                               keyboardType='numeric'
                               maxLength={6}
                               numberOfLines={1}
                               placeholder="value in centimeters"
                               value={this.getValue(this.state.sizes, rowID)}
                               onChangeText={(text) => {
                                   this.state.values[rowID] = {
                                       name_ru: rowData.name_ru,
                                       name_en: rowData.name_en,
                                       value: text
                                   }
                               }}/>
                </View>
            </View>
        )
    }

PS我尝试使用react-native-keyboard-aware-scroll-view - 没有结果

listview
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-07-07 22:22:37 +0000 UTC

如何在 React Native 中解析 json 结构

  • 0

不久前,我开始学习 React Native。并且遇到了问题。我正在尝试解析https://www.cryptocompare.com/api/data/coinlist 并从数据部分获取图片链接我得到了部分本身

dataImages: Array(responseJson.Data)
console.log(this.state.dataImages[0])

看起来像这样:

"42": {
"Id": "4321",
"Url": "/coins/42/overview",
"ImageUrl": "/media/12318415/42.png",
"Name": "42",
"Symbol": "42",
"CoinName": "42 Coin",
"FullName": "42 Coin (42)",
"Algorithm": "Scrypt",
"ProofType": "PoW/PoS",
"FullyPremined": "0",
"TotalCoinSupply": "42",
"PreMinedValue": "N/A",
"TotalCoinsFreeFloat": "N/A",
"SortOrder": "34",
"Sponsored": false
},
"300": {
"Id": "749869",
"Url": "/coins/300/overview",
"ImageUrl": "/media/27010595/300.png",
"Name": "300",
"Symbol": "300",
"CoinName": "300 token",
"FullName": "300 token (300)",
"Algorithm": "N/A",
"ProofType": "N/A",
"FullyPremined": "0",
"TotalCoinSupply": "300",
"PreMinedValue": "N/A",
"TotalCoinsFreeFloat": "N/A",
"SortOrder": "2212",
"Sponsored": false
},...

尽管我添加了“[0]”,但如果在输入“.DOGE”(元素名称)之后,我可以获得元素但我需要从所有元素中获取 ImageUrl 或 Name 字段请告诉我我做错了什么.

javascript
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-03-29 04:06:50 +0000 UTC

如何知道 ExecutorService 线程池是否已经完成?

  • 2

再会。有一个代码:

ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 3; i++) {
            executorService.execute(new ParallelRunnable(parallelGraph, parallelLineData, i));
    }

它创建一个线程池。问题是:如何捕获这个执行器的所有线程的完成并在完成时执行代码。动作发生在 android 上。

java
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-03-15 23:41:50 +0000 UTC

如何使用 BackupAgentHelper

  • 1

有一个代码:

public class BackupHelper extends BackupAgentHelper {

    public static final Object[] DATA_LOCK = new Object[0];

    @Override
    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
                         ParcelFileDescriptor newState) throws IOException {

        synchronized (DATA_LOCK) {
            super.onBackup(oldState, data, newState);
        }
        Log.d("BackupHelper", "onBackup()");
    }

    @Override
    public void onCreate(){
        FileBackupHelper db = new FileBackupHelper(this, DatabaseHelper.DATABASE_NAME);
        addHelper(DatabaseHelper.DATABASE_NAME, db);
        Log.d("BackupHelper", "onCreate()");
    }

    @Override
    public File getFilesDir(){
        File path = getDatabasePath(DatabaseHelper.DATABASE_NAME);
        return path.getParentFile();
    }

    @Override
    public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
            throws IOException {
        Log.d("BackupHelper", "onRestore()");
        synchronized (DATA_LOCK) {
            super.onRestore(data, appVersionCode, newState);
        }
    }
}

清单说:

android:allowBackup="true"
android:fullBackupOnly="true"
android:backupInForeground="true"
android:backupAgent=".app.db.BackupHelper"

我这样称呼:

private BackupManager backupManager;
backupManager = new BackupManager(context);

但即使是来自 BackupHelper 的日志也不会显示。也许我做错了什么?请帮助,我已经挣扎了几天。

android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-03-15 16:35:05 +0000 UTC

重新安装应用程序时如何在删除和恢复之前保存数据?

  • 1

我正在编写一个应用程序,在工作时,它将数据保存在 SQLite 中。重要的是应用程序在删除之前将数据保存在云中,然后在安装后将其拉起。您无需注册即可实施。

是否可以使用谷歌(使用谷歌帐户)本地执行此操作?如果可能,怎么做?还有其他方法吗?

android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-03-10 20:22:47 +0000 UTC

MPAndroidChart 如何设置 X 比例

  • 0

同志们下午好,我使用 MPAndroidChart 库绘制了价格随时间变化的线性图。Y 标尺没有问题,但我无法让 X 标尺充分发挥作用。有水将所需值代入此刻度,具体取决于位置:

IAxisValueFormatter formatter = new IAxisValueFormatter() {
    @Override
    public String getFormattedValue(float value, AxisBase axis) {
        return quarters[(int) value];
    }
;
XAxis xAxis = mLineChart.getXAxis();
xAxis.setGranularity(1f); // minimum axis-step (interval) is 1
xAxis.setValueFormatter(formatter);

但是有一个问题,加载器在加载结束时重新绘制图形,加载器通过选择用户想要查看结果的时间段来启动。如果我们想在 10 分钟内看到结果,那么来自服务器的值少于 10 个,如果在一天内,则超过 100 个。问题是由于某种原因该值没有更新,而当100个值后我需要回看10个,它在轴列表中查找100个中的Y值,自然找不到它们,因为我们只有10个要崩溃。实际上问题是如何重置这些值?在将数据传递给图表之前,我执行 mChart.clear(); 我不明白出了什么问题。请帮助理解。

android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-02-23 02:30:32 +0000 UTC

如何在手机旋转时保持 dialogFragment

  • 0

同志们好。有一个fragment dialog(一个单独的类)是通过接口创建的,通过点击listView中的一个item(点击在adapter中处理,在activity中调用接口)。数据被传递到这个对话框(用于编辑和保存到数据库)。旋转手机时如何保存对话框的状态?更准确地说,我像这样保存对话框本身的状态:

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        if (builder != null) {
            savedInstanceState.putBoolean("showDialog", true);
            savedInstanceState.putString("id", String.valueOf(id));
            savedInstanceState.putString("key", key);
            if (!String.valueOf(posTextView.getText()).equals("")) {
                savedInstanceState.putDouble("posTextView", Double.parseDouble(String.valueOf(posTextView.getText())));
            } else {
                savedInstanceState.putDouble("posTextView", 0);
            }
            if (!String.valueOf(priceTextView.getText()).equals("")) {
                savedInstanceState.putDouble("priceTextView", Double.parseDouble(String.valueOf(priceTextView.getText())));
            } else {
                savedInstanceState.putDouble("priceTextView", 0);
            }
            savedInstanceState.putLong("dateLong", resultDate);
        } else {
            savedInstanceState.putBoolean("showDialog", false);
        }
    }

我恢复

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    setRetainInstance(true);
    if (savedInstanceState != null && savedInstanceState.getBoolean("showDialog")) {
        this.id= savedInstanceState.getInt("id");
        this.key= savedInstanceState.getString("key");
        this.quantity = savedInstanceState.getDouble("posTextView");
        this.price = savedInstanceState.getDouble("priceTextView");
        this.dateLong = savedInstanceState.getLong("dateLong");
    }

旋转后如何在活动中调用包含此数据的对话框?除非旧的已关闭,否则不会创建新的。对话框构造函数(即使在恢复数据后也需要上下文,否则为 nullPointerException)

 public EditPortfolioDialogFragment newInstance(Integer id, String key, double quantity, double price, long dateLong,
                                                   boolean buy, Context context, PortfolioItemSaveListener portfolioItemSaveListener) {
        EditPortfolioDialogFragment dialogFragment = new EditPortfolioDialogFragment();

        this.coinId = id;
        if (key != null) {
            this.key = key;
            this.oldKey = key;
        } else {
            this.key = "abc";
        }
        this.quantity = quantity;
        this.price = price;
        this.dateLong = dateLong;

        this.context = context;
        this.portfolioItemSaveListener = portfolioItemSaveListener;
        return dialogFragment;
    }
android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-02-17 08:09:35 +0000 UTC

安卓下载器不工作

  • 0

一个小时我不明白为什么工作室强调 return new ProfessionListLoader(MainActivity.this); 并且不允许应用程序运行。

import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.tanat.english_for_professions.R;
import com.tanat.english_for_professions.loader.ProfessionListLoader;
import java.util.ArrayList;
import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<ArrayList<String>> {
    private int LOADER_ID = 0;

    @BindView(R.id.professionList)
    ListView professionList;
    @BindView(R.id.toolbar)
    Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        ButterKnife.bind(this);
        setSupportActionBar(toolbar);
        loadData();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public Loader<ArrayList<String>> onCreateLoader(int id, Bundle args) {
        return new ProfessionListLoader(MainActivity.this);
    }

    @Override
    public void onLoadFinished(Loader<ArrayList<String>> loader, ArrayList<String> data) {

    }

    @Override
    public void onLoaderReset(Loader<ArrayList<String>> loader) {

    }

    private void loadData() {
        ArrayList data = null;
        if (data == null || data.size() == 0) {
            getSupportLoaderManager().initLoader(LOADER_ID, null, this);
        } else {
            createListAdapter(data);
        }
    }

    public void createListAdapter(ArrayList data) {
        ArrayAdapter<String> adapter;
        if (data != null) {
            adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
            professionList.setAdapter(adapter);
        }
    }
}

装载机:

import android.content.AsyncTaskLoader;
import android.content.Context;
import android.util.Log;
import com.tanat.english_for_professions.R;
import com.tanat.english_for_professions.utils.JsonDisperse;
import org.json.JSONException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class ProfessionListLoader extends AsyncTaskLoader<ArrayList<String>> {
    private Context context;

    public ProfessionListLoader(Context context) {
        super(context);
        this.context = context;
    }

    String jsonString = "";
    InputStream inputStream;
    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;

    @Override
    public ArrayList<String> loadInBackground() {
        try {
            URL url = new URL("url-url-url");

            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);
            }
            jsonString = buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        Log.d("loader", jsonString);
        JsonDisperse jsonDisperse = new JsonDisperse();
        jsonDisperse.saveStaticString(jsonString);

        try {
            return jsonDisperse.getListProfession(Integer.parseInt(context.getString(R.string.language)));
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
    }
}

如果你悬停,上下文会原谅,但我也给它。 在此处输入图像描述 请帮帮我。

android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-02-13 03:09:09 +0000 UTC

如何创建具有不同领域名称的相同模型

  • 2

实际上在 Realm 中,模型类的名称与表的名称相同。以及如何创建许多具有不同名称但每个模型有 1 个模型的表?也就是说,假设有一个鞋品牌列表,这是1个表,每个品牌都有一个集合(这些表和品牌一样多,虽然可能还有更多,但我们不会分心)每个鞋子集合中的模型有:id、颜色、价格......(不取决于鞋子的集合或品牌)假设您需要解析 JSON 并将其保存到表中。

一、品牌列表

2.collection_dolce

3.collection_eccet

...................................

N.collection_xxx

如何为一个模型创建具有不同名称的这些表?在品牌列表中,您可以添加一个包含集合表名称的列

android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-02-12 04:04:08 +0000 UTC

如何将 ButterKnife 库连接到片段

  • 1

ButterKnife 库已经连接到项目并且可以工作,但是如何将它连接到这个片段。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    inflater.inflate(R.layout.profession_list_fragment, null);

    ButterKnife.bind(this, ???);

    serviceIntent = new Intent(getActivity(), ServiceLoad.class);
    setConnection();

    loadData ();

    return super.onCreateView(inflater, container, savedInstanceState);
}

提前致谢。

android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-02-08 02:03:14 +0000 UTC

自定义 infoWindow 如何添加阴影并将其移动到标记下?

  • 0

先生们好!有这样的代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:elevation="10dp"
    android:background="@drawable/card_background"
    >

    <TextView
        android:id="@+id/textView_dialog_address"
        style="@style/SecondaryTextView"
        android:layout_width="140dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:layout_marginTop="12dp"
        android:text="text"
        android:textAlignment="center"
        android:textStyle="bold"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

它看起来像这样:

在此处输入图像描述

我需要 infoWindow 在这样的标记下: 在此处输入图像描述

+我只是无法在我一直在争取第三天的信息窗口下充分添加阴影,请尽你所能帮助任何人)

android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-02-01 17:09:54 +0000 UTC

Android 使用 AsyncTask 后报错

  • 0

有以下片段:package tanat.androidtesttask.fragments;

import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
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.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.google.firebase.crash.FirebaseCrash;

import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

import io.realm.Realm;
import io.realm.RealmAsyncTask;
import io.realm.RealmConfiguration;
import io.realm.RealmResults;
import tanat.androidtesttask.BuildConfig;
import tanat.androidtesttask.activity.InfoRoutActivity;
import tanat.androidtesttask.R;
import tanat.androidtesttask.activity.MainActivity;
import tanat.androidtesttask.database.DBHelper;
import tanat.androidtesttask.database.RealmController;
import tanat.androidtesttask.model.RealmModel;
import tanat.androidtesttask.service.BroadcastService;
import tanat.androidtesttask.utils.JSONParsing;
import tanat.androidtesttask.utils.LoadLocalData;
import tanat.androidtesttask.errorreporter.Log;

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

    @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;

    //button to update if an error
    @OnClick(R.id.refreshButton)
    void onRefreshClick() {
        onRefresh();
    }

    private View rootView;

    private final static int STATUS_START = 100;
    private final static int STATUS_FINISH = 200;
    private final static String PARAM_RESULT = "result";
    private final static String PARAM_STATUS = "status";
    public final static String BROADCAST_ACTION = "tanat.androidtesttask.activity";
    private BroadcastReceiver broadcastReceiver;

    private LoadLocalData loadLocalData;
    DBHelper dbHelper;
    Realm realm;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_item, null);
        ButterKnife.bind(this, rootView);

        swipeRefreshLayout.setOnRefreshListener(this);

        intent = new Intent(getActivity(), BroadcastService.class);
        setsConnection();

        loadLocalData = new LoadLocalData(getActivity());

        dbHelper = new DBHelper(getActivity());

        Realm.init(getActivity());

        setRetainInstance(true);
        return rootView;
    }

    Intent intent;
    private ArrayList data = null;

    private void setsConnection (){
        broadcastReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                int status = intent.getIntExtra(PARAM_STATUS, 0);
                if (status == STATUS_START) {
                    if (BuildConfig.USE_LOG) {Log.d("server start task");}
                    FirebaseCrash.log("server start task");
                }
                if (status == STATUS_FINISH) {
                    if (BuildConfig.USE_LOG) {Log.d("server finish task");}
                    FirebaseCrash.log("server finish task");

                    data = intent.getStringArrayListExtra(PARAM_RESULT);
                    procesShowData();

                    saveCache();
                }
            }
        };
        IntentFilter intFilt = new IntentFilter(BROADCAST_ACTION);

        getActivity().registerReceiver(broadcastReceiver, intFilt);
    }

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

    @Override
    public void onPause(){
        // save the data so that you do not load it again when return to the fragment
        if(data != null && !data.get(0).toString().equals("false")) {
            if (BuildConfig.USE_LOG) {Log.d("pause before save");}
            //save data in file
            loadLocalData.writeFile(FILE_NAME, new JSONParsing().dispatch());
        }
        if (BuildConfig.USE_LOG) {Log.d("pause last save");}
        super.onPause();
    }

    @Override
    public void onDestroy() {
        getActivity().unregisterReceiver(broadcastReceiver);
        getActivity().stopService(intent);
        super.onDestroy();
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        loadLocalData.writeFile(FILE_NAME, new JSONParsing().dispatch());

        Intent intent = new Intent(ListFragment.this.getContext(), InfoRoutActivity.class);
        intent.putExtra("position", position);
        startActivity(intent);
    }

    @Override
    public void onRefresh() {
        swipeRefreshLayout.setRefreshing(true);

        getActivity().startService(intent);
    }

    private String FILE_NAME = "JsonTestTask";
    // loading data
    private void loadData (){
        // start show progress dialog
        swipeRefreshLayout.setRefreshing(true);

        // upload local data
        data = loadLocalData.returnArray(FILE_NAME);

        //if there is no data, load it from the network
        if (data == null || data.size() == 0 || data.get(0).toString().equals("false")) {
            data = null;
            getActivity().startService(intent);
        }
    }

    private void procesShowData (){
        if(data != null){
            if(data.get(0).toString().equals("false")){
                contentLayout.setVisibility(View.INVISIBLE);
                errorLayout.setVisibility(View.VISIBLE);
                errorTextView.setText(data.get(1).toString());
            } else {
                // if network operation true
                errorLayout.setVisibility(View.INVISIBLE);
                contentLayout.setVisibility(View.VISIBLE);
                // create list
                createdList();
            }
        } else {
            errorLayout.setVisibility(View.INVISIBLE);
            contentLayout.setVisibility(View.VISIBLE);
            createdList();
        }
        if (data != null) {
            swipeRefreshLayout.setRefreshing(false);
        }
    }

    private ArrayAdapter<String> adapter;

    // create list
    public void createdList(){
        if (data != null){
            adapter = new ArrayAdapter<String>(getActivity(),
                    android.R.layout.simple_list_item_1, data);
        } else {
            adapter = null;
        }
        setListAdapter(adapter);
    }

    public void saveCache (){
        int checkTypeDatabase = new MainActivity().checkTypeDatabase;
        if (checkTypeDatabase == 1) {
            // use Realm database
            CacheRealm cacheRealm = new CacheRealm();
            cacheRealm.execute();

        } else if (checkTypeDatabase == 2) {
            // use SQLite database
            CacheSQLite cacheSQLite = new CacheSQLite();
            cacheSQLite.execute();
        }
    }

    private int id = 0;

    private int name_from_city = 1;
    private int highlight_from_city = 2;
    private int id_from_city = 3;

    private int name_to_city = 4;
    private int highlight_to_city = 5;
    private int id_to_city = 6;

    private int info = 7;

    private int from_date = 8;
    private int from_time = 9;
    private int from_info = 10;

    private int to_date = 11;
    private int to_time = 12;
    private int to_info = 13;

    private int price = 14;
    private int bus_id = 15;
    private int reservation_count = 16;

    // Caching the query in the Realm database
    class CacheRealm extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            ArrayList<String[]> arrayList = new JSONParsing().examineJSONObj();

            Realm realm = Realm.getDefaultInstance();

            try {
            realm.beginTransaction();

            RealmResults<RealmModel> results = realm.where(RealmModel.class).findAll();
            results.deleteAllFromRealm();

            for (int i = 0; i < arrayList.size(); i++) {
                RealmModel realmObject = realm.createObject(RealmModel.class);

                realmObject.setId(Integer.valueOf(arrayList.get(i)[id]));

                realmObject.setName_from_city(arrayList.get(i)[name_from_city]);
                realmObject.setHighlight_from_city(arrayList.get(i)[highlight_from_city]);
                realmObject.setId_from_city(Integer.valueOf(arrayList.get(i)[id_from_city]));

                realmObject.setName_to_city(arrayList.get(i)[name_to_city]);
                realmObject.setHighlight_to_city(arrayList.get(i)[highlight_to_city]);
                realmObject.setId_to_city(Integer.valueOf(arrayList.get(i)[id_to_city]));

                realmObject.setInfo(arrayList.get(i)[info]);

                realmObject.setFrom_date(arrayList.get(i)[from_date]);
                realmObject.setFrom_time(arrayList.get(i)[from_time]);
                realmObject.setFrom_info(arrayList.get(i)[from_info]);

                realmObject.setTo_date(arrayList.get(i)[to_date]);
                realmObject.setTo_time(arrayList.get(i)[to_time]);
                realmObject.setTo_info(arrayList.get(i)[to_info]);

                realmObject.setPrice(Integer.valueOf(arrayList.get(i)[price]));
                realmObject.setBus_id(Integer.valueOf(arrayList.get(i)[bus_id]));
                realmObject.setReservation_count(Integer.valueOf(arrayList.get(i)[reservation_count]));
            }

            realm.commitTransaction();

            } finally {
                realm.close();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            if (BuildConfig.USE_LOG) {Log.d("The cache is written to the Realm database");}
            super.onPostExecute(result);
        }
    }

    // Caching the query in the SQLite database
    class CacheSQLite extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            SQLiteDatabase db = dbHelper.getWritableDatabase();

            ContentValues values = new ContentValues();
            ArrayList<String[]> arrayList = new JSONParsing().examineJSONObj();

            db.delete(dbHelper.TABLE_NAME, null, null);
            for (int i = 0; i < arrayList.size(); i++){
                values.put(dbHelper.ID, arrayList.get(i)[id]);
                values.put(dbHelper.NAME_FROM_CITY, arrayList.get(i)[name_from_city]);
                values.put(dbHelper.HIGHLIGHT_FROM_CITY, arrayList.get(i)[highlight_from_city]);
                values.put(dbHelper.ID_FROM_CITY, arrayList.get(i)[id_from_city]);
                values.put(dbHelper.NAME_TO_CITY, arrayList.get(i)[name_to_city]);
                values.put(dbHelper.HIGHLIGHT_TO_CITY, arrayList.get(i)[highlight_to_city]);
                values.put(dbHelper.ID_TO_CITY, arrayList.get(i)[id_to_city]);
                values.put(dbHelper.INFO, arrayList.get(i)[info]);
                values.put(dbHelper.FROM_DATE, arrayList.get(i)[from_date]);
                values.put(dbHelper.FROM_TIME, arrayList.get(i)[from_time]);
                values.put(DBHelper.FROM_INFO, arrayList.get(i)[from_info]);
                values.put(DBHelper.TO_DATE, arrayList.get(i)[to_date]);
                values.put(dbHelper.TO_TIME, arrayList.get(i)[to_time]);
                values.put(dbHelper.TO_INFO, arrayList.get(i)[to_info]);
                values.put(dbHelper.PRICE, arrayList.get(i)[price]);
                values.put(dbHelper.BUS_ID, arrayList.get(i)[bus_id]);
                values.put(dbHelper.RESERVATION_COUNT, arrayList.get(i)[reservation_count]);

                db.insert(dbHelper.TABLE_NAME, null, values);
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            if (BuildConfig.USE_LOG) {Log.d("The cache is written to the SQLite database");}
            super.onPostExecute(result);
        }
    }
}

问题是,如果您在使用其中一个 AsyncTask 之后调用 onPause 方法(即使在最后一个完成之后)。错误文本如下:

    02-01 03:52:39.581 1688-1688/tanat.androidtesttask E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference
                                                                                at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:183)
at tanat.androidtesttask.d.b.a(Unknown Source)
at tanat.androidtesttask.fragments.ListFragment.onListItemClick(Unknown Source)
at android.app.ListFragment$2.onItemClick(ListFragment.java:160)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042)
at android.widget.AbsListView.onTouchUp(AbsListView.java:3891)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:3656)
at android.view.View.dispatchTouchEvent(View.java:9294)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2547)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2240)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
at android.app.Activity.dispatchTouchEvent(Activity.java:2765)
at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
at android.view.View.dispatchPointerEvent(View.java:9514)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5922)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5896)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5857)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6025)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.ne
    02-01 03:52:39.586 1688-1688/tanat.androidtesttask E/AndroidRuntime: FATAL EXCEPTION: main
Process: tanat.androidtesttask, PID: 1688
java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference
at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:183)
at tanat.androidtesttask.d.b.a(Unknown Source)
at tanat.androidtesttask.fragments.ListFragment.onListItemClick(Unknown Source)
at android.app.ListFragment$2.onItemClick(ListFragment.java:160)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042)
at android.widget.AbsListView.onTouchUp(AbsListView.java:3891)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:3656)
at android.view.View.dispatchTouchEvent(View.java:9294)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2547)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2240)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
at android.app.Activity.dispatchTouchEvent(Activity.java:2765)
at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
at android.view.View.dispatchPointerEvent(View.java:9514)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
at 
android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.

我不明白问题出在哪里,因为没有一个 asyncTasks 使用 onPause 使用的任何东西。请帮助理解。

android
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-01-28 02:41:22 +0000 UTC

写权限android后出错

  • 0

有一个代码:

    import android.Manifest;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.os.Environment;
    import android.support.v4.app.ActivityCompat;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;
    import com.google.firebase.analytics.FirebaseAnalytics;
    import tanat.androidtesttask.R;
    import tanat.androidtesttask.errorreporter.GetLogs;
    import tanat.androidtesttask.utils.LoadLocalData;
    import tanat.androidtesttask.utils.SendEMail;

    public class MainActivity extends Activity {

        private FirebaseAnalytics mFirebaseAnalytics;
        public Context context;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            setContentView(R.layout.activity_main);

            // Obtain the FirebaseAnalytics instance.
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);

            context = MainActivity.this;
            super.onCreate(savedInstanceState);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu, menu);
            return true;
        }

        public String LOG_FILE_NAME = "logs";

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            String action = "";

            int i = item.getItemId();
            //
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

            if (i == R.id.save_logs) {
                    if (isCheckPermission(1)) {
                        saveLogs();
                    }
            } else if (i == R.id.send_logs) {
                if (isCheckPermission(2)) {
                    new SendEMail(MainActivity.this).send(LOG_FILE_NAME);
                    tanat.androidtesttask.errorreporter.Log.d("Permission granted, file sending");
                } else {
    ///
                }
            }
            } else {
                action = "Insert a memory card";
            }
            Toast.makeText(this, action, Toast.LENGTH_SHORT).show();
            return super.onOptionsItemSelected(item);
        }

        private boolean isCheckPermission(int i) {
            if (i == 1) {
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
                        PackageManager.PERMISSION_GRANTED) {

                    // Should we show an explanation?
                    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        showMessageOKCancel("Requires write permission to save logs to file");
                        return false;
                    }

                    // No explanation needed, we can request the permission.
                    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            PERMISSIONS_REQUEST);

                    return false;
                    // MY_PERMISSIONS_REQUEST is an
                    // app-defined int constant. The callback method gets the
                    // result of the request.
                }
                return true;
            } else if (i == 2) {
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) !=
                        PackageManager.PERMISSION_GRANTED) {

                    // Should we show an explanation?
                    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                        showMessageOKCancel("Requires read permission to transfer file");
                        return false;
                    }
                    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
                            PERMISSIONS_REQUEST);

                    return false;
                }

                return true;
            }
            return false;
        }

        private void showMessageOKCancel(String message) {
            new AlertDialog.Builder(MainActivity.this)
                    .setMessage(message)
                    .setPositiveButton("OK", listener)
                    .setNegativeButton("Cancel", listener)
                    .create()
                    .show();
        }

        final private int PERMISSIONS_REQUEST = 7;

        DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {

            final int BUTTON_NEGATIVE = -2;
            final int BUTTON_POSITIVE = -1;

            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case BUTTON_NEGATIVE:
                        // int which = -2
                        dialog.dismiss();
                        break;

                    case BUTTON_POSITIVE:
                        // int which = -1
                        ActivityCompat.requestPermissions(
                                MainActivity.this, new String[]{
                                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                        android.Manifest.permission.READ_EXTERNAL_STORAGE},
                                PERMISSIONS_REQUEST);
                        dialog.dismiss();
                        break;
                }
            }
        };

    /*    Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg){
                LoadLocalData loadSD = new LoadLocalData(MainActivity.this);
                loadSD.writeFileSD(LOG_FILE_NAME, GetLogs.get());
                Toast.makeText(MainActivity.this, "Logs save", Toast.LENGTH_SHORT).show();
            }
        };*/

        @Override
        public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
            switch (requestCode) {
                case PERMISSIONS_REQUEST: {
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                        // permission was granted!
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        //Toast.makeText(this, "Permission on write storage granted", Toast.LENGTH_SHORT).show();
                            saveLogs();
                        }
                        if (grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(this, "Permission on read storage granted.", Toast.LENGTH_SHORT).show();
                        }

                    } else {

                        // permission denied, boo! Disable the
                        // functionality that depends on this permission.
                    }
                    return;
                }

                // other 'case' lines to check for other
                // permissions this app might request.
            }
        }

//метод который сохраняет логи
        public void saveLogs (){
            LoadLocalData loadSD = new LoadLocalData(MainActivity.this);
            loadSD.writeFileSD(LOG_FILE_NAME, GetLogs.get());
            Toast.makeText(this, "Logs save", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onDestroy() {
        //    Log.d("Logs","Logs: " + GetLogs.get());

            super.onDestroy();
        }
    }

在第一次尝试保存日志时,它会请求将数据写入存储卡的权限,如果获得,它会写入文件,然后立即崩溃并出现错误:

E/UncaughtException: java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=7, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {tanat.androidtesttask/tanat.androidtesttask.activity.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
                         at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
                         at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
                         at android.app.ActivityThread.-wrap16(ActivityThread.java)
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
                         at android.os.Handler.dispatchMessage(Handler.java:102)
                         at android.os.Looper.loop(Looper.java:148)
                         at android.app.ActivityThread.main(ActivityThread.java:5417)
                         at java.lang.reflect.Method.invoke(Native Method)
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                      Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
                         at tanat.androidtesttask.activity.MainActivity.onRequestPermissionsResult(Unknown Source)
                         at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6553)
                         at android.app.Activity.dispatchActivityResult(Activity.java:6432)
                         at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
                         at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
                         at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                         at android.os.Looper.loop(Looper.java:148) 
                         at android.app.ActivityThread.main(ActivityThread.java:5417) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: tanat.androidtesttask, PID: 2022
                  java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=7, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {tanat.androidtesttask/tanat.androidtesttask.activity.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
                      at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
                      at android.app.ActivityThread.-wrap16(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
                      at tanat.androidtesttask.activity.MainActivity.onRequestPermissionsResult(Unknown Source)
                      at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6553)
                      at android.app.Activity.dispatchActivityResult(Activity.java:6432)
                      at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
                      at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

在随后的发射中(当已经获得许可时)没有问题。如果您删除数据保存方法,只需放一个 toast - 它可以工作(更准确地说,它是这样工作的,但它不会随着 toast 而退出)。我读到权限对话框似乎在一个单独的线程中,我试图通过hander保存它(虽然这也是废话,然后toast也不起作用),但无济于事。请告诉我如何解决这个问题?

java
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-01-27 00:29:43 +0000 UTC

如何在 logcat android 中捕获带有 d 标签的消息?

  • 0

先生们好日子。通常,任务是获取应用程序执行日志并通过邮件将它们发送给开发人员。我认为发送会有问题,但日志不会有问题。有一个代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class GetLogs {

    public static String get(){
        StringBuilder builder = new StringBuilder();
        try {
            Process process = Runtime.getRuntime().exec("logcat -d all");

            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                builder.append(line + "\n");
            }
        } catch (IOException e){
            Log.d("Error getting logs");
        }
        return builder.toString();
    }
}

该类只是捕获并返回日志,问题在于它捕获它们的标签。“logcat -d all”应该捕获所有带有d标签的日志,但是我手动输出的那些日志原则上不会捕获。我这样输出它(好吧,你永远不知道):

Log.d("MyLog","TEST");

上面的方法返回以下内容:

    --------- beginning of system
01-26 08:42:37.797  1813  1827 E ActivityThread: Failed to find provider info for com.google.android.gms.chimera
    --------- beginning of main
01-26 08:42:37.797  1813  1827 I chatty  : uid=10080(tanat.androidtesttask) expire 8 lines
01-26 08:42:37.805  1813  1829 I chatty  : uid=10080(tanat.androidtesttask) expire 1 line
01-26 08:42:37.900  1813  1831 I chatty  : uid=10080(tanat.androidtesttask) expire 24 lines
01-26 08:42:39.136  1813  1832 I chatty  : uid=10080(tanat.androidtesttask) expire 9 lines
01-26 08:43:19.769  1813  1848 I chatty  : uid=10080(tanat.androidtesttask) expire 15 lines
01-26 08:43:20.075  1813  1813 I chatty  : uid=10080(tanat.androidtesttask) expire 6 lines
01-26 08:57:52.638  1974  1974 I chatty  : uid=10080(tanat.androidtesttask) expire 27 lines
01-26 08:57:52.670  1974  1988 E ActivityThread: Failed to find provider info for com.google.android.gms.chimera
01-26 08:57:52.670  1974  1988 I chatty  : uid=10080(tanat.androidtesttask) expire 8 lines
01-26 08:57:52.678  1974  1990 I chatty  : uid=10080(tanat.androidtesttask) expire 1 line
01-26 08:57:52.699  1974  1992 I chatty  : uid=10080(tanat.androidtesttask) expire 39 lines
01-26 08:57:53.029  1974  1993 I chatty  : uid=10080(tanat.androidtesttask) expire 9 lines
01-26 09:02:55.283  2073  2073 I chatty  : uid=10080(tanat.androidtesttask) expire 17 lines
01-26 09:02:55.317  2073  2087 E ActivityThread: Failed to find provider info for com.google.android.gms.chimera
01-26 09:02:55.317  2073  2087 I chatty  : uid=10080(tanat.androidtesttask) expire 8 lines
01-26 09:02:55.322  2073  2089 I chatty  : uid=10080(tanat.androidtesttask) expire 1 line
01-26 09:02:55.347  2073  2091 I chatty  : uid=10080(tanat.androidtesttask) expire 3 lines
     --------- beginning of crash
01-26 09:02:55.355  2073  2073 E AndroidRuntime: FATAL EXCEPTION: main
01-26 09:02:55.355  2073  2073 E AndroidRuntime: Process: tanat.androidtesttask, PID: 2073
01-26 09:02:55.355  2073  2073 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{tanat.androidtesttask/tanat.androidtesttask.activity.MainActivity}: java.lang.ArithmeticException: divide by zero
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.app.ActivityThread.-wrap11(ActivityThread.java)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:102)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:148)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:5417)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-26 09:02:55.355  2073  2073 E AndroidRuntime: Caused by: java.lang.ArithmeticException: divide by zero
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at tanat.androidtesttask.activity.MainActivity.onCreate(Unknown Source)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.app.Activity.performCreate(Activity.java:6237)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
01-26 09:02:55.355  2073  2073 E AndroidRuntime:    ... 9 more
01-26 09:03:15.533  2102  2102 I chatty  : uid=10080(tanat.androidtesttask) expir

事实上,如果您添加更多我编写的日志,这就是您所需要的。请告诉我,怎么做?

java
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-01-25 20:26:57 +0000 UTC

无法将 Firebase Crashlytics 连接到项目

  • 1

再会。我想连接到 Crashlytics 项目,我跟着办公室。指令但抛出错误:

Error:Execution failed for task ':app:processDebugGoogleServices'.
> Please fix the version conflict either by updating the version of the google-services plugin (information about the latest version is available at https://bintray.com/android/android-tools/com.google.gms.google-services/) or updating the version of com.google.android.gms to 11.4.2.

我无法弄清楚版本不兼容的确切位置。build.gradle 项目代码

buildscript {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven {
            url 'https://maven.fabric.io/public'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'

        classpath 'com.google.gms:google-services:3.1.2'
        classpath 'io.fabric.tools:gradle:1.24.4'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url 'https://maven.google.com/'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle 应用代码

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "tanat.androidtesttask"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.android.support:recyclerview-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

    compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
        transitive = true
    }
    compile 'com.google.firebase:firebase-core:11.8.0'
}

请帮我找到解决方案。

java
  • 2 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-01-24 05:49:26 +0000 UTC

如何从服务获取数据到类

  • 2

有一个接收片段数据的类

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 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-01-23 02:38:53 +0000 UTC

无法在单独的类android中读取文件

  • 0

有以下类用于写入和读取文件(手机内部存储器)

import android.content.Context;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class LoadData {

    public void loadData (){
    }

    // переменная в которой записано название файла что представляет собой локальную строку json
    // или локальную базу
    private String FILENAME = "jsonmytest";

    //метод для сохранение строки json в файл (создание локальной базы)
    protected void write(String answer) {
        try {
            // отрываем поток для записи
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(openFileOutput(FILENAME, Context.MODE_PRIVATE)));
            // пишем данные
            bw.write(answer);
            // закрываем поток
            bw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // метод для чтения строки json из файла
    public String readFile() {
        String str = "";
        try {
            // открываем поток для чтения
            BufferedReader br = new BufferedReader(new InputStreamReader(openFileInput(FILENAME)));
            // читаем содержимое
            str = br.readLine();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }
}

openFileOutput 和 openFileInput 方法以红色突出显示,并且在悬停时写入无法解析方法“openFileInput(java.long.String)”自然会导入所有库。

在 MainActivity 类中,read 和 write 方法的代码完全相同,但这需要在另一个类中加载。请帮忙,我不知道出了什么问题。

java
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-01-11 15:49:49 +0000 UTC

如何将数据从 servlet 输出到 JSP 页面

  • 1

下午好,我正在为一名课程工作者用 Java 制作一个 Web 应用程序。出现技术问题。我无法将带有对象的 ArrayList 中的数据输出到将在浏览器页面上的表中。有数据的类代码:

package tanat.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import tanat.beans.IceFloe;
import tanat.database.DBUtils;
import tanat.database.MySQLConnUtils;



@WebServlet(urlPatterns = { "/icefloelist" })
public class IceFloeList extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public IceFloeList() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

   //     Connection conn = MyUtils.getStoredConnection(request);
    Connection conn = null;
        String errorString = null;
        List<IceFloe> listfloe = null;

        conn = MySQLConnUtils.getDBConnection();

        try {
            listfloe = DBUtils.queryIceFloe(conn);
        } catch (SQLException e) {
            e.printStackTrace();
            errorString = e.getMessage();
        } 
        // Сохранить информацию в request attribute перед тем как forward к views.
        request.setAttribute("errorString", errorString);
        request.setAttribute("listfloe", listfloe);

        // проверял, в консоль данные идут
        for (int i=0; i< listfloe.size(); i++) {
            System.out.println(listfloe.get(i).getId());
            System.out.println(listfloe.get(i).getNameIceFloe());
            System.out.println(listfloe.get(i).getNumberOfFishermen());
            System.out.println("\n");
        }

        // Forward к /views/productListView.jsp
        RequestDispatcher dispatcher = request.getRequestDispatcher("/views/iceFloeListView.jsp");
        // и так пробывал
//      RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/views/iceFloeListView.jsp");
        dispatcher.forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

jsp页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>SalvageService</title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>

    <div class="navcont" align="center">
        <div class="nav">
            <ul>
                <li><a href="index.html">Главная</a></li>
                <li><a href="ships.html">Корабли</a></li>
                <li><a href="#">Рыбаки</a></li>
                <li><a href="#">Море</a></li>
            </ul>
        </div>
    </div>
    <main>

<table border="1" cellpadding="5" cellspacing="1" >
       <tr>
          <th>Code</th>
          <th>Name</th>
          <th>Price</th>
          <th>Edit</th>
          <th>Delete</th>
       </tr>
       <c:forEach items="${listfloe}" var="iceFloe">
          <tr>
             <td>${iceFloe.id}</td>
             <td>${iceFloe.name}</td>
             <td>${iceFloe.numberOfFishermen}</td>
             <td>
                <a href="editProduct?code=${iceFloe.id}">Edit</a>
             </td>
             <td>
                <a href="deleteProduct?code=${iceFloe.id}">Delete</a>
             </td>
          </tr>
       </c:forEach>
    </table>
    </main>

    <footer>
    <hr>
    <p align="center">
        <small>
        <time>01-2017</time> © Kravchenko Pavel
       </small>
    </p>
    </footer>

</body>
</html>

也就是应该把数据代入表中,但是在控制台中并没有出现这种情况,它写了以下内容,但我认为这不是错误

янв 11, 2018 9:33:29 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:SalvageService' did not find a matching property.
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version:        Apache Tomcat/8.0.36
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Jun 9 2016 13:55:50 UTC
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         8.0.36.0
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Windows 10
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            10.0
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             C:\Program Files\Java\jre1.8.0_151
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.8.0_151-b12
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         D:\Developer\JavaScript\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         C:\Tomcat
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=D:\Developer\JavaScript\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=C:\Tomcat
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=D:\Developer\JavaScript\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=C:\Tomcat\endorsed
янв 11, 2018 9:33:29 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=Cp1251
янв 11, 2018 9:33:29 AM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre1.8.0_151\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_151/bin/server;C:/Program Files/Java/jre1.8.0_151/bin;C:/Program Files/Java/jre1.8.0_151/lib/amd64;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Git\cmd;C:\Server\web\apache\bin;C:\Server\web\mysql\bin;;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Users\TaNaT\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm\;C:\Users\TaNaT\AppData\Local\Microsoft\WindowsApps;C:\Server\web\apache\bin;C:\Server\web\mysql\bin;;C:\Users\TaNaT\Desktop;;.
янв 11, 2018 9:33:29 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
янв 11, 2018 9:33:30 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
янв 11, 2018 9:33:30 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
янв 11, 2018 9:33:30 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
янв 11, 2018 9:33:30 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1545 ms
янв 11, 2018 9:33:30 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
янв 11, 2018 9:33:30 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.36
янв 11, 2018 9:33:34 AM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
янв 11, 2018 9:33:38 AM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
янв 11, 2018 9:33:38 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
янв 11, 2018 9:33:38 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
янв 11, 2018 9:33:38 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 7951 ms
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
1
scandinavi
4


2
sibir
7

大多数关于启动服务器的信息,但也许我错过了一些东西,最后证明数据在那里。如果需要 - respasitorium https://bitbucket.org/pahan-titan/salvageservice 请帮助,剩下的时间不多了)提前致谢。

javascript
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-01-11 03:51:31 +0000 UTC

MySql 无法连接到 Java 中的 WEB 应用程序

  • 0

我正在用 Java 为学期论文编写一个 Web 应用程序。启动时出现错误

SEVERE: Servlet.service() for servlet [tanat.servlet.IceFloeList] in context with path [/SalvageService] threw exception
java.lang.NullPointerException
    at tanat.database.DBUtils.queryIceFloe(DBUtils.java:19)
    at tanat.servlet.IceFloeList.doGet(IceFloeList.java:47)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)

发誓,因为我了解这门课

package tanat.database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import tanat.beans.IceFloe;

public class DBUtils {

    public static List<IceFloe> queryIceFloe(Connection conn) throws SQLException {
        String sql = "SELECT `id`, `name_ice_floe`, ` number_of_fishermen` "
                + "FROM ice_floe ORDER BY 'number_of_fishermen' DESC;";

        PreparedStatement pstm = conn.prepareStatement(sql);  //на эту строку ругается
        ResultSet rs = pstm.executeQuery();
        List<IceFloe> list = new ArrayList<IceFloe>();

//пробывал через статмент ничего не меняеться
//      Statement statement = conn.createStatement();
//      ResultSet rs = statement.executeQuery(sql);

        while (rs.next()) {
            int id = rs.getInt("ID");
            String name = rs.getString("Name");
            int numberOfFishermen = rs.getInt("NumberOfFishermen");
            IceFloe iceFloe = new IceFloe();
            iceFloe.setId(id);
            iceFloe.setNameIceFloe(name);
            iceFloe.setNumberOfFishermen(numberOfFishermen);
            list.add(iceFloe);
        }
        return list;
    }

    public static IceFloe findIceFloe(Connection conn, String code) throws SQLException {
        String sql = "Select a.Code, a.Name, a.Price from Product a where a.Code=?";

        PreparedStatement pstm = conn.prepareStatement(sql);
        pstm.setString(1, code);

        ResultSet rs = pstm.executeQuery();

        while (rs.next()) {
            String name = rs.getString("Name");
            int numberOfFishermen = rs.getInt("NumberOfFishermen");
            IceFloe iceFloe = new IceFloe();
            iceFloe.setNameIceFloe(name);
            iceFloe.setNumberOfFishermen(numberOfFishermen);
            return iceFloe;
        }
        return null;
    }

    public static void updateIceFloe(Connection conn, IceFloe iceFloe) throws SQLException {
        String sql = "Update Product set Name =?, Price=? where Code=? ";

        PreparedStatement pstm = conn.prepareStatement(sql);

        pstm.setInt(1, iceFloe.getId());
        pstm.setString(2, iceFloe.getnameIceFloe());
        pstm.setInt(3, iceFloe.getNumberOfFishermen());

        pstm.executeUpdate();
    }

    public static void insertIceFloe(Connection conn, IceFloe iceFloe) throws SQLException {
        String sql = "Insert into Product(Code, Name,Price) values (?,?,?)";

        PreparedStatement pstm = conn.prepareStatement(sql);

        pstm.setInt(1, iceFloe.getId());
        pstm.setString(2, iceFloe.getnameIceFloe());
        pstm.setInt(3, iceFloe.getNumberOfFishermen());

        pstm.executeUpdate();
    }

    //удаление льдины
    //по идее нужно реализовать автоматическое удаление если количество рыбаков становиться равным 0
    public static void deleteIceFloe(Connection conn, String code) throws SQLException {
        String sql = "Delete From Product where Code= ?";

        PreparedStatement pstm = conn.prepareStatement(sql);

        pstm.setString(1, code);

        pstm.executeUpdate();
    }

}

请帮帮我,我已经摆弄了3天,剩下的时间不多了)如果您需要查看其他课程:https ://bitbucket.org/pahan-titan/salvageservice/src 提前谢谢

javascript
  • 1 个回答
  • 10 Views
Martin Hope
Pavel Zlotarenchuk
Asked: 2020-01-09 02:31:13 +0000 UTC

安卓线程问题

  • 0

有以下代码:

package tanat.androidtesttask;

import android.app.DialogFragment;
import android.app.ListFragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
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.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainList extends ListFragment implements SwipeRefreshLayout.OnRefreshListener{

    SwipeRefreshLayout mSwipeRefreshLayout;
    ArrayList data;
    DialogFragment dialogFragment;

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

        dialogFragment = new MyDialog();

        mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState){

        dialogFragment.show(getFragmentManager(), "");

        final Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                data = new MainActivity().demo();
            }
        });
        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        dialogFragment.dismiss();


        //      dialogFragment.show(getFragmentManager(), "");

 //       data = new MainActivity().demo();

        //создаем лист фрагментов
        super.onActivityCreated(savedInstanceState);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, data);
        setListAdapter(adapter);
    }

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

    }

    //вешаем слушатель на нажатие фрагмента
    @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(MainList.this.getContext(), InfoRoutActivity.class);
        //записываем в него ключ и позицию
        intent.putExtra("position", position);
        //передаем
        startActivity(intent);
    }

    //свайп вниз для обновления
    @Override
    public void onRefresh() {
        // говорим о том, что собираемся начать
        Toast.makeText(getActivity(), "Обновляем", Toast.LENGTH_SHORT).show();
        // начинаем показывать прогресс
        mSwipeRefreshLayout.setRefreshing(true);
        // ждем 3 секунды и прячем прогресс
        mSwipeRefreshLayout.postDelayed(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(false);
                // говорим о том, что собираемся закончить
                Toast.makeText(getActivity(),"обновили", Toast.LENGTH_SHORT).show();
            }
        }, 3000);
    }
}

这是片段类。当它被创建时,另一个片段被调用,它只是一个自定义的DialogFragment,就像一个进度对话框。和团队

data = new MainActivity().demo();

进入活动,从它到服务并加载 json,然后我们等到这个线程被执行并关闭进度对话框,然后我们从我们下载的数据中创建一个 ListFragment,至少按照预期,但是在这个命令上敲出以下错误

E/AndroidRuntime: FATAL EXCEPTION: Thread-130
                  Process: tanat.androidtesttask, PID: 1700
                  java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
                      at android.os.Handler.<init>(Handler.java:200)
                      at android.os.Handler.<init>(Handler.java:114)
                      at android.app.Activity.<init>(Activity.java:754)
                      at tanat.androidtesttask.MainActivity.<init>(MainActivity.java:0)
                      at tanat.androidtesttask.MainList$1.run(MainList.java:50)
                      at java.lang.Thread.run(Thread.java:818)

我已经尝试过使用 Handler 但我无法弄清楚在这种情况下如何正确使用它,我已经在互联网上翻找了 2 天但无济于事。请帮助提前谢谢。

java
  • 1 个回答
  • 10 Views

Sidebar

Stats

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

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +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