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

Time:06-03

I am working on a android application project using xampp(service.php and mysql database). When I am compiling the application the emulator shows app has stopped. When I saw the run tab the following below errors show up. I don't know how solve this issue. and don't know where the error is occurring. I tried running HomeActivity as first screen, in that case app is working fine but when I make MainActivity the first screen it show app has stopped. I am seeking help from you guys. Thanks in advanced.

Error:

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)

My MainActivity.kt File

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()
        }
    }
}}

CodePudding user response:

Don't post images, they're hard to read and you've missed the bottom of the stacktrace (which tells you exactly where the source of the problem is). In future, just copy and paste the whole thing, and that will let people help you.

Your problem is you're doing things that require a Context, before you actually have one. You'll have a context by the time onCreate runs, but not during construction, where you're doing this:

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

I don't know if the ProgressDialog constructor is trying to access the Context on the Activity you're passing in (because your screenshots cut off the bottom of the stacktrace where the root cause is), but getSharedPreferences definitely is. You can't make those calls at construction time

Either make them lateinit and initialise them in 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)
    ...
}

or make them lazy so they initialise when you access them, which should be in or after onCreate

private val progressDialog: ProgressDialog by lazy { ProgressDialog(this) }
private val sharedPreferences: SharedPreferences by lazy { getSharedPreferences(Constant.PREF_NAME, MODE_PRIVATE) }
  • Related