0

Ich versuche, eine DialogFragment von OnPostExecute zu starten, aber der supportFragmentManager gibt aus irgendeinem Grund null zurück. Ich habe versucht, das dialogFragment aus Hauptaktivität und anderen Fragmenten zu starten, und es funktioniert perfekt, aber ich kann es nicht von AsyncTask starten. Hier ist die AsyncTask: -SupportfragmentManager wird null android kotlin

class SubscribeTask: AsyncTask<Void, Void, Void> { 
    var mContext: Context 
    var mTextView_temp: TextView 
    var mTextView_humidity: TextView 
    var mWeather_image: ImageView 
    var mMessage: JsonObject 
    var mResult = JsonObject() 
    var mTemp: String = "" 
    var mHumidity: String = "" 
    var mLdr: Boolean = true 
    var mRain: Boolean = false 
    var mWeather: Int = 0 
    var tester: Boolean = false 
    var mFire: Boolean = false 

    constructor(context: Context, textView_temp: TextView, textView_humidity: TextView, weather_image: ImageView, message: PNMessageResult){ 
     mContext = context 
     mMessage = message.message.asJsonObject 
     mTextView_temp = textView_temp 
     mTextView_humidity = textView_humidity 
     mWeather_image = weather_image 
    } 

    override fun doInBackground(vararg p0: Void?): Void? { 
     if (mMessage.has("pi")){ 
      mResult = mMessage.getAsJsonObject("pi") 
      mTemp = mResult.get("temp").asString 
      mHumidity = mResult.get("humidity").asString 
      mLdr = mResult.get("ldr").asBoolean 
      mRain = mResult.get("rain").asBoolean 
      mFire = mResult.get("fire").asBoolean 
      tester = true 
      if(mRain){ 
       mWeather = R.drawable.rainy 
      }else if(mLdr){ 
       mWeather = R.drawable.suny 
      }else{ 
       mWeather = R.drawable.cloudyy 
      } 
     } 
     return null 
    } 

    override fun onPostExecute(result: Void?) { 
     if(tester) { 
      mTextView_temp.text = mTemp 
      mTextView_humidity.text = mHumidity 
      mWeather_image.setImageResource(mWeather) 
      if(mFire){ 
       MainActivity().showAlertDialog("Fire", "There might be a fire in the house", R.drawable.house_fire, "Stop Alarm") 
      } 
     } 
    } 

} 

hier die showAlertDialog ist() Funktion: -

fun showAlertDialog(title: String, content: String, imageid: Int, button: String){ 
     val fm = supportFragmentManager 
     val alertDialogFragment = AlertFragment(title, content, imageid, button).newInstance(title, content, imageid, button) 
     alertDialogFragment.show(fm, "fragment_alert") 
    } 

Hier ist die dialogFragment: -

class AlertFragment(val mTitle: String, val mContent: String, val mImageId: Int, val mButton: String) : DialogFragment() { 

    fun newInstance(title: String, content: String, imageid: Int, button: String): AlertFragment { 
     val alertfrag = AlertFragment(title, content, imageid, button) 
     val args = Bundle() 
     args.putString("title", title) 
     alertfrag.arguments = args 
     return alertfrag 
    } 

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, 
           savedInstanceState: Bundle?): View? { 
     // Inflate the layout for this fragment 
     return inflater!!.inflate(R.layout.fragment_alert, container, false) 
    } 

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { 
     super.onViewCreated(view, savedInstanceState) 
     title.text = mTitle 
     alertContent.text = mContent 
     alertImageId.setImageResource(mImageId) 
     alertButton.text = mButton 
    } 
} 

Kann mir bitte jemand helfen. Antworten in Java sind auch in Ordnung.

Antwort

0

Sie können Observer Pattern dafür verwenden.

Erstellen Sie eine Schnittstelle wie die

interface myExecListener { 
fun onFinish(title: String, content: String, imageid: Int, button: 
String) 
} 

Fügen Sie diese Zeilen in SubscribeTask

class SubscribeTask: AsyncTask<Void, Void, Void>() { 
var listener: myExecListener? = null 

    fun exec(listener: myExecListener){ 
    this.listener = listener 
    this.execute() 
    } 

    override fun doInBackground(vararg params: Void?): Void? { 


    return null 
    } 

    override fun onPostExecute(result: Void?) { 
    super.onPostExecute(result) 
    listener?.onFinish("Fire", "There might be a fire in the house", 333, "Stop Alarm") 
    } 
} 

Und in Ihrer Tätigkeit ausführen

SubscribeTask().exec(object : myExecListener{ 
    override fun onFinish(title: String, content: String, imageid: Int, button: String) { 
    println("Observer triggered") 
    showAlertDialog(title, content, imageid, button) 
    } 
}) 
1

In Ihrer postExecute Funktion haben Sie den folgenden Code:

MainActivity().showAlertDialog(...) 

Diese schafft eine neue Aktivität Objekt, das auf jeden Fall nicht der Fall ist, was getan werden sollte. Da dieses Objekt neu erstellt und nicht ordnungsgemäß von Android initialisiert wird, werden interne Objekte wie der supportFragmentManager nicht initialisiert, was dazu führt, dass die null Sie sehen.

+0

Also, was soll ich tun? –

+0

Im Allgemeinen speichern Benutzer eine 'WeakReference' der übergeordneten Aktivität in der' AsyncTask' und greifen dann auf diese Referenz in 'postExecute' zu, wenn sie etwas für die Aktivität aufrufen müssen. – Kiskae

+0

können Sie irgendein Beispiel oder Code geben, denn ich bin ein Noob –