我的应用程序可以在虚拟设备上运行,但不能在物理设备上运行

时间:2020-06-06 03:11:50

标签: java android

我是Android Studio的新手,我刚完成我的第一个应用程序。然后,我想在我的手机上对其进行测试,但是它似乎不起作用。即使它在Android Studio中的虚拟设备上像超级按钮一样工作,它也甚至在启动前就崩溃了。我将在此处发布一些信息,并希望有人能帮助我,因为我没有真正了解它。

Logcat输出:

2020-06-06 05:01:12.188 12297-12297/? I/dlingsassisten: Late-enabling -Xcheck:jni
2020-06-06 05:01:12.218 12297-12297/? E/dlingsassisten: Unknown bits set in runtime_flags: 0x8000
2020-06-06 05:01:12.482 12297-12297/com.example.handlingsassistent I/Perf: Connecting to perf service.
2020-06-06 05:01:12.495 12297-12297/com.example.handlingsassistent I/dlingsassisten: [GL_OOM] ClampGrowthLimit 268435456
2020-06-06 05:01:12.499 12297-12297/com.example.handlingsassistent V/Font: Change font:1
2020-06-06 05:01:12.500 12297-12297/com.example.handlingsassistent V/Font: Default family:android.graphics.Typeface@3668eb82
2020-06-06 05:01:12.507 12297-12332/com.example.handlingsassistent E/Perf: Fail to get file list com.example.handlingsassistent
2020-06-06 05:01:12.507 12297-12332/com.example.handlingsassistent E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-06-06 05:01:12.507 12297-12332/com.example.handlingsassistent E/Perf: Fail to get file list com.example.handlingsassistent
2020-06-06 05:01:12.507 12297-12332/com.example.handlingsassistent E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-06-06 05:01:12.690 12297-12297/com.example.handlingsassistent W/dlingsassisten: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
2020-06-06 05:01:12.692 12297-12297/com.example.handlingsassistent W/dlingsassisten: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
2020-06-06 05:01:12.864 12297-12297/com.example.handlingsassistent D/AndroidRuntime: Shutting down VM
2020-06-06 05:01:12.868 12297-12297/com.example.handlingsassistent E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.handlingsassistent, PID: 12297
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.handlingsassistent/com.example.handlingsassistent.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3387)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3526)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2122)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7695)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:392)
        at android.widget.ListView.setAdapter(ListView.java:585)
        at com.example.handlingsassistent.MainActivity.onCreate(MainActivity.java:42)
        at android.app.Activity.performCreate(Activity.java:7820)
        at android.app.Activity.performCreate(Activity.java:7809)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1318)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3362)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3526) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2122) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7695) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 
2020-06-06 05:01:12.910 12297-12297/com.example.handlingsassistent I/Process: Sending signal. PID: 12297 SIG: 9

主要活动

package com.example.handlingsassistent;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    List<String> arrList = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loadData();


        ListView shoppingListView = findViewById(R.id.shoppingListView);

        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                R.layout.list_layout,
                arrList);

        shoppingListView.setAdapter(adapter);
        //Möjliggör att kunna välja flera alternativ i listan.
        shoppingListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        shoppingListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                arrList.remove(position);
                adapter.notifyDataSetChanged();
                saveData();
                return true;
            }
        });
    }


    public void addToList (View v){
        if( ((TextView) findViewById(R.id.inputText)).getText().toString().isEmpty()) {
            Log.d("Empty", "Input is empty");
        }
        else {
            arrList.add(((TextView) findViewById(R.id.inputText)).getText().toString());
            ((ListView) findViewById(R.id.shoppingListView)).invalidateViews();
            ((TextView) findViewById(R.id.inputText)).setText("");
            saveData();
        }
    }

    // Referens: https://developer.android.com/guide/topics/ui/dialogs.html
    public void clearList (View v){

        AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.setTitle(R.string.alert_title);
            alert.setMessage(R.string.alert_message);
            alert.setPositiveButton(R.string.alert_yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    arrList.clear();
                    ((ListView) findViewById(R.id.shoppingListView)).invalidateViews();
                    saveData();
                }
            });
            alert.setNegativeButton(R.string.alert_no, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            });
            alert.create().show();

    }

    // Referens: https://www.youtube.com/watch?v=jcliHGR3CHo
    private void saveData(){
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(arrList);
        editor.putString("task list", json);
        editor.apply();
    }
    // Referens: https://www.youtube.com/watch?v=jcliHGR3CHo
    private void loadData(){
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("task list", null);
        Type type = new TypeToken<ArrayList<String>>() {}.getType();
        arrList = gson.fromJson(json, type);

    }

    public void loadTemplateActivity(View v){
        Intent intent = new Intent(this, TemplateActivity.class);
        startActivity(intent);
    }

    public void loadSpendingActivity(View v){
        Intent intent = new Intent(this, SpendingActivity.class);
        startActivity(intent);
    }
}```

Hope this information is enough. I'll keep an eye out if you request something else to help me out.


2 个答案:

答案 0 :(得分:2)

在构造类初始化之后,您的arrList可能会被设置回null。

尝试检查null并按如下所示进行设置。

   private void loadData(){
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("task list", null);
        Type type = new TypeToken<ArrayList<String>>() {}.getType();
        arrList = gson.fromJson(json, type);
        if (arrList  == null) {
            arrList = new ArrayList<String>();
        }
    }

如果您以前保存过列表,我认为它不会崩溃。这可能就是为什么它没有在模拟器上崩溃的原因。它可能会在任何新设备上崩溃。

答案 1 :(得分:1)

您将收到此异常,因为您正在尝试使用空适配器构建ListView。因为您是第一次启动应用,所以您以loadData()方法调用onCreate();并且为arrList分配了一个空值,因为SharedPreference仍然没有保存在ot中。

您可以解决此问题,以首先检查返回的SharedPference是否不为空;否则分配一个空数组

因此,如下更改loadData()

    private void loadData(){
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("task list", null);
        Type type = new TypeToken<ArrayList<String>>() {}.getType();
        arrList = gson.fromJson(json, type);

        if (arrList == null)
            arrList = new ArrayList<String>(); 

    }

相关问题