마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

도와주세요 000 has stopped 라고 떠요

0 추천

제발 도와주세요

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/button121"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="144dp"
        android:layout_marginTop="244dp"
        android:onClick="export"
        android:text="Button1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
package com.programmerworld.qqqqqqqqqqqqqqqqqqqqq;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;

import java.io.File;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

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

    public void export(View view){
        StringBuilder data = new StringBuilder();
        data.append("Time,Distance");
        for (int i = 0; i<5; i++) {
            data.append("\n"+String.valueOf(i)+","+String.valueOf(i*i));
        }
        try {
            FileOutputStream out = openFileOutput("data.csv", Context.MODE_PRIVATE);
            out.write((data.toString()).getBytes());
            out.close();

            Context context = getApplicationContext();
            File filelocation = new File(getFilesDir(), "data.csv");
            Uri path = FileProvider.getUriForFile(context, "programmerworld.qqqqqqqqqqqqqqqqqqqqq.fileprovider", filelocation);
            Intent fileIntent = new Intent(Intent.ACTION_SEND);
            fileIntent.setType("text/csv");
            fileIntent.putExtra(Intent.EXTRA_SUBJECT, "Data");
            fileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            fileIntent.putExtra(Intent.EXTRA_STREAM, path);
            startActivity(Intent.createChooser(fileIntent, "Send mail"));

        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.programmerworld.qqqqqqqqqqqqqqqqqqqqq">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Qqqqqqqqqqqqqqqqqqqqq">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.programmerworld.qqqqqqqqqqqqqqqqqqqqq"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.File_provider_paths"
                android:resource="@xml/provider_paths"/>
                    </provider>

    </application>

</manifest>
이렇게 되어 있는데 앱을 실행하면 실행이 안돼요 ㅠㅠㅠ
제발 도와주세요
청청청 (120 포인트) 님이 2021년 5월 9일 질문

1개의 답변

0 추천

에러 로그도 없이 코드만 올리셔서 그냥 막연한 추측한 하게 되는데요.

for (int i = 0; i<5; i++) {
      data.append("\n"+String.valueOf(i)+","+String.valueOf(i*i));
 }

위의 루프문에서 String.valueOf(i) 부분에서 예외가 발생하지는 않나요?

* export 메소드 처럼 IO 동작을 하는 코드는 메인쓰레드에 위치시키시면 안됩니다. 백그라운드 쓰레드로 위치시키세요. UI를 블락할 확률이 높아요.. 모발 프로그래밍의 아주 기본적이지만 중요한 사항입니다.

 

 

 

 

 

spark (224,800 포인트) 님이 2021년 5월 9일 답변
정말 너무너무 감사드립니다!!!!
에러 코드가 안드로이드 스튜디오에서는 안뜨고 앱 실행하면 000000 has stopped라고만 뜨는데
제가 완전 초보라 백그라운드 쓰레드가 어떤건지 잘 몰라서 그러는데 혹시 어떻게 써야 하는지 알려주실 수 있을까요? 로그캣에는 이렇게 떴어요ㅠㅠ

2021-05-09 10:36:20.681 3422-3422/? I/zygote: Not late-enabling -Xcheck:jni (already on)
2021-05-09 10:36:20.685 3422-3422/? W/zygote: Unexpected CPU variant for X86 using defaults: x86
2021-05-09 10:36:20.838 3422-3422/com.programmerworld.qqqqqqqqqqqqqqqqqqqqq D/AndroidRuntime: Shutting down VM
2021-05-09 10:36:20.839 3422-3422/com.programmerworld.qqqqqqqqqqqqqqqqqqqqq E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.programmerworld.qqqqqqqqqqqqqqqqqqqqq, PID: 3422
    java.lang.RuntimeException: Unable to get provider androidx.core.content.FileProvider: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data
        at android.app.ActivityThread.installProvider(ActivityThread.java:6288)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5851)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5772)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data
        at androidx.core.content.FileProvider.parsePathStrategy(FileProvider.java:613)
        at androidx.core.content.FileProvider.getPathStrategy(FileProvider.java:579)
        at androidx.core.content.FileProvider.attachInfo(FileProvider.java:392)
        at android.app.ActivityThread.installProvider(ActivityThread.java:6285)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5851) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5772) 
        at android.app.ActivityThread.-wrap1(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
Caused by: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data 부분이 문제네요.

https://developer.android.com/reference/androidx/core/content/FileProvider
여기를 보시면 될거예요.
보통 화면을 그려주는 일을 담당하는 쓰레드를 UI/Main Thread라고 하고 백그라운드에서 실행되는 걸 Background/Worker Thread라고 합니다. UI Thread는 16 millisecond 마디화면을 갱신해주어야 때문에 항상 바빠며, 따라서 화면을 그려주는 일 외에는 가급적이면 시키지 않는 게 좋습니다. 별도의 지정없이 하는 동작은 UI Thread 에서 동작합니다.
Handler(UI Thread), AsynTask(Background + UI Thread. Deprecated), Thread(Backgroudn Thread), runOnUiThread(Main Thread) 등등을 사용하여 Thread 작업을 보통 수행합니다.
Thread 인스턴스를 생성하여 백그라운드 쓰레드를 생성할 수 있습니다. 보통 회사들에서 사용하는 앱은 Thread를 직접 생성하기 보다는 RxJava(Java)나 Coroutine(Kotlin) 같은 걸 많이 사용하는 편입니다. 왜냐하면 간단한 작업이 아니면 쓰레드 핸들링이 복잡하기 때문입니다.
그리고 UI에 접근하는 작업은 반드시 UI Thread에서 하셔야 합니다. 그렇지 않으면, 앱이 크래쉬 됩니다.
이렇게 세세하게 설명까지 해주시다니
정말 감사합니다!!!
...