构建应用程序后出现错误,模拟器显示应用程序已停止

Errors coming after I build the App and Emulator show App has stopped

我正在使用 xampp(service.php 和 mysql 数据库)开发一个 android 应用程序项目。当我编译应用程序时,模拟器显示应用程序已停止。当我看到 运行 选项卡时,出现以下错误。

我该如何解决这个问题?我不知道错误发生在哪里。我尝试将 运行ning HomeActivity 作为第一个屏幕,在这种情况下,应用程序运行正常,但是当我将 MainActivity 作为第一个屏幕时,它显示应用程序已停止。

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.project.newsapp, PID: 27328
java.lang.RuntimeException: Canvas: trying to draw too large(309746632bytes) bitmap.
    at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:229)
    at android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:97)
    at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:529)
    at android.widget.ImageView.onDraw(ImageView.java:1367)
    at android.view.View.draw(View.java:19123)
    at android.view.View.updateDisplayListIfDirty(View.java:18073)
    at android.view.View.draw(View.java:18851)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
    at android.view.View.updateDisplayListIfDirty(View.java:18064)
    at android.view.View.draw(View.java:18851)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
    at android.view.View.updateDisplayListIfDirty(View.java:18064)
    at android.view.View.draw(View.java:18851)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
    at android.view.View.updateDisplayListIfDirty(View.java:18064)
    at android.view.View.draw(View.java:18851)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
    at android.view.View.updateDisplayListIfDirty(View.java:18064)
    at android.view.View.draw(View.java:18851)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
    at android.view.View.updateDisplayListIfDirty(View.java:18064)
    at android.view.View.draw(View.java:18851)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
    at android.view.View.updateDisplayListIfDirty(View.java:18064)
    at android.view.View.draw(View.java:18851)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
    at android.view.View.draw(View.java:19126)
    at com.android.internal.policy.DecorView.draw(DecorView.java:785)
    at android.view.View.updateDisplayListIfDirty(View.java:18073)
    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:643)
    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:649)
    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:757)
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:2980)
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2794)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2347)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
    at android.view.Choreographer.doCallbacks(Choreographer.java:723)
    at android.view.Choreographer.doFrame(Choreographer.java:658)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    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)

我的MainActivity.kt文件

package com.project.newsapp

import android.app.ProgressDialog
import android.content.Intent
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.project.newsapp.contract.Request
import com.project.newsapp.contract.Response
import com.project.newsapp.network.IRequestContract
import com.project.newsapp.network.NetworkClient
import com.project.newsapp.utils.Constant
import com.project.newsapp.utils.showToast
import kotlinx.android.synthetic.main.activity_main.*
import retrofit2.Call
import retrofit2.Callback

class MainActivity : AppCompatActivity(), Callback<Response> {

private val retrofitClient = NetworkClient.getNetworkClient()
private val requestContract = retrofitClient.create(IRequestContract::class.java)
private val progressDialog:ProgressDialog by lazy { ProgressDialog(this) }
private val sharedPreferences:SharedPreferences by lazy { getSharedPreferences(Constant.PREF_NAME, MODE_PRIVATE) }
lateinit var userName:String

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    progressDialog.setMessage("Please wait...")
    progressDialog.setCancelable(true)

    checkIfUserAlreadyRegistered()

    btnRegister.setOnClickListener {
        userName = edUserName.text.toString().trim().uppercase()
        if(userName.isNullOrEmpty()){
            showToast("Please Enter your Name")
        }else{
            progressDialog.show()
            val request = Request(
                action = Constant.REGISTER_USER,
                userName = userName
            )
            val callResponse = requestContract.makeApiCall(request)
            callResponse.enqueue(this)
        }
    }

    /*btnExit.setOnClickListener {
        finish()
    }*/
}

override fun onFailure(call: Call<Response>, t: Throwable) {
    if(progressDialog.isShowing)
        progressDialog.dismiss()

    showToast("Server is not responding. Please try again later.")
    edUserName.setText("")
}

override fun onResponse(call: Call<Response>, response: retrofit2.Response<Response>) {
    if(progressDialog.isShowing)
        progressDialog.dismiss()

    if(response.body()!=null){
        val serverResponse = response.body()
        if(serverResponse!!.status){
            saveUserToPref(serverResponse.userId,userName)
            Intent(this, HomeActivity::class.java).apply {
                putExtra(Constant.KEY_USER_ID, serverResponse.userId)
                putExtra(Constant.KEY_USER_NAME, userName)
                startActivity(this)
                finish()
            }
        }else{
            showToast(serverResponse.message)
            edUserName.setText("")
        }
    }
    else{
        showToast("Server is not responding. Please try again later.")
        edUserName.setText("")
    }
}

private fun saveUserToPref(userId:String, userName:String){
    val editor = sharedPreferences.edit()
    editor.putString(Constant.KEY_USER_ID,userId)
    editor.putString(Constant.KEY_USER_NAME,userName)
    editor.commit()
}

private fun checkIfUserAlreadyRegistered(){
    val userId = sharedPreferences.getString(Constant.KEY_USER_ID,"invalid user id")
    val userName = sharedPreferences.getString(Constant.KEY_USER_NAME,"invalid user name")

    if(!userId.contentEquals("invalid user id")
        && !userName.contentEquals("invalid user name")){
        Intent(this, HomeActivity::class.java).apply {
            putExtra(Constant.KEY_USER_ID, userId)
            putExtra(Constant.KEY_USER_NAME, userName)
            startActivity(this)
            finish()
        }
    }
}}

你的问题是你在做一些需要Context的事情,然后才真正拥有一个。在 onCreate 运行时,您将拥有一个上下文,但在您正在执行此操作的构造期间不会:

private val progressDialog: ProgressDialog = ProgressDialog(this)
private var sharedPreferences: SharedPreferences = getSharedPreferences(Constant.PREF_NAME, MODE_PRIVATE)

我不知道 ProgressDialog 构造函数是否试图访问您传入的 Activity 上的 Context(因为您的屏幕截图截断了根本原因所在的堆栈跟踪),但 getSharedPreferences 肯定是。您不能在施工时拨打这些电话

要么制作它们 lateinit 并在 onCreate

中初始化它们
private lateinit var progressDialog: ProgressDialog
private lateinit var sharedPreferences: SharedPreferences

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    progressDialog = ProgressDialog(this)
    sharedPreferences = getSharedPreferences(Constant.PREF_NAME, MODE_PRIVATE)
    ...
}

或将它们设置为 lazy 以便在您访问它们时进行初始化,这应该在 onCreate

之内或之后
private val progressDialog: ProgressDialog by lazy { ProgressDialog(this) }
private val sharedPreferences: SharedPreferences by lazy { getSharedPreferences(Constant.PREF_NAME, MODE_PRIVATE) }