17

I am using android library androidx.appcompat:appcompat:1.0.2. Working on a sample of codelabs work manager. I need to get live data from ViewModel and I am using this

    mViewModel!!.getOutputWorkInfo()?.observe(this, Observer<List<WorkInfo>> {
 })

but this variable shows error - Type mismatch. Required:Lifecycle Owner. Found:BlurActivity

I googled all says no need to extend lifecycle owner, by default appcompact activity implements lifecycle owner.

And I also worked this in another project, no issues found. I don't know why I am getting this error in this project.

`

import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.RadioGroup

import com.bumptech.glide.Glide

import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.work.WorkInfo

class BlurActivity : AppCompatActivity() {

    private var mViewModel: BlurViewModel? = null
    private var mImageView: ImageView? = null
    private var mProgressBar: ProgressBar? = null
    private var mGoButton: Button? = null
    private var mOutputButton: Button? = null
    private var mCancelButton: Button? = null

    /**
     * Get the blur level from the radio button as an integer
     * @return Integer representing the amount of times to blur the image
     */
    private val blurLevel: Int
        get() {
            val radioGroup = findViewById<RadioGroup>(R.id.radio_blur_group)

            return when (radioGroup.checkedRadioButtonId) {
                R.id.radio_blur_lv_1 ->  1
                R.id.radio_blur_lv_2 ->  2
                R.id.radio_blur_lv_3 ->  3
                else -> 1
            }
        }


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

        // Get the ViewModel
        mViewModel = ViewModelProviders.of(this).get(BlurViewModel::class.java)

        // Get all of the Views
        mImageView = findViewById(R.id.image_view)
        mProgressBar = findViewById(R.id.progress_bar)
        mGoButton = findViewById(R.id.go_button)
        mOutputButton = findViewById(R.id.see_file_button)
        mCancelButton = findViewById(R.id.cancel_button)

        // Image uri should be stored in the ViewModel; put it there then display
        val intent = intent
        val imageUriExtra = intent.getStringExtra(Constants.KEY_IMAGE_URI)
        mViewModel!!.setImageUri(imageUriExtra)
        if (mViewModel!!.imageUri != null) {
            Glide.with(this).load(mViewModel!!.imageUri).into(mImageView!!)
        }

        mViewModel!!.getOutputWorkInfo()?.observe(this, Observer<List<WorkInfo>> {
            // If there are no matching work info, do nothing
            if (it == null || it.isEmpty()) return@Observer

            // We only care about the first output status.
            // Every continuation has only one worker tagged TAG_OUTPUT
            val workInfo = it[0]

            val finished = workInfo.state.isFinished
            if (!finished) showWorkInProgress() else showWorkFinished()
        })


        // Setup blur image file button
        mGoButton!!.setOnClickListener { view -> mViewModel!!.applyBlur(blurLevel) }
    }

    /**
     * Shows and hides views for when the Activity is processing an image
     */
    private fun showWorkInProgress() {
        mProgressBar!!.visibility = View.VISIBLE
        mCancelButton!!.visibility = View.VISIBLE
        mGoButton!!.visibility = View.GONE
        mOutputButton!!.visibility = View.GONE
    }

    /**
     * Shows and hides views for when the Activity is done processing an image
     */
    private fun showWorkFinished() {
        mProgressBar!!.visibility = View.GONE
        mCancelButton!!.visibility = View.GONE
        mGoButton!!.visibility = View.VISIBLE
    }
}

`

Rajen Raiyarela
  • 5,526
  • 4
  • 21
  • 41
Karthick Ramanathan
  • 642
  • 3
  • 9
  • 20
  • Where do you use this piece of code? **this** should be any `LifeCycleOwner` *(i.e. Activity or Fragment)* – Jeel Vankhede Jan 25 '19 at 06:39
  • 1
    activity, `class BlurActivity : AppCompatActivity()` – Karthick Ramanathan Jan 25 '19 at 06:42
  • Try this code : `mViewModel!!.getOutputWorkInfo()?.observe(this@BlurActivity, Observer> { })` – Jeel Vankhede Jan 25 '19 at 06:43
  • same error getting – Karthick Ramanathan Jan 25 '19 at 06:45
  • It's weird. In documentation androidx AppCompatActivity is not implementing LifeCycleOwner, but in my code (If I open its sources) it does. – Andrei Vinogradov Jan 25 '19 at 06:52
  • It's two different pages on that in docs: https://developer.android.com/reference/kotlin/androidx/appcompat/app/AppCompatActivity# and https://developer.android.com/reference/androidx/appcompat/app/AppCompatActivity . First not implementing LifeCycleOwner and second does. But package is the same. – Andrei Vinogradov Jan 25 '19 at 06:55
  • Yes, because it's moved from `AppCompatActivity` to `ComponentActivity`. check here https://developer.android.com/reference/androidx/activity/ComponentActivity – Jeel Vankhede Jan 25 '19 at 06:58
  • @JeelVankhede you misunderstood. Its two different pages for SAME class in SAME package. With different description. One is LifecycleOwner second is not. – Andrei Vinogradov Jan 25 '19 at 07:02
  • Then what whould you say about this release note : https://developer.android.com/jetpack/androidx/releases/activity#1.0.0-alpha01 FIY, we're talking about **AndroidX packages** right? – Jeel Vankhede Jan 25 '19 at 07:13

4 Answers4

19

Same problem here, so I had to update my androidx.appcompat dependency, like below:

implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'

no need to implement LifecycleOwner (as its implemented by default now {as mentioned by Darthcow})

TarekB
  • 757
  • 14
  • 20
10

After implementing LifeCycleOwner in Main Activity, error goes and work properly

Updated

Use latest androidx lib and u don't need to implement LifecycleOwner. Now it is implemented by default in ComponentActivity which AppcompatActivity implements

Karthick Ramanathan
  • 642
  • 3
  • 9
  • 20
1

I got this error while trying to parse a context as a Life cycle owner and a helpful way to solve it is using a type cast

context as LifecycleOwner
Chic
  • 9,836
  • 4
  • 33
  • 62
0

This issue occurs when there is mismatch between appcompat and Lifecycle dependency.

Either use this set of dependencies:

implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version
implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'

Or:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
Morphyish
  • 3,932
  • 8
  • 26