2017-10-24 11 views
0

onPostExecute에서 dialogFragment를 시작하려고하지만 어떤 이유로 supportFragmentManager가 null을 반환합니다. 주 활동 및 다른 조각에서 dialogFragment를 시작하려고 시도했지만 완벽하게 작동하지만 AsyncTask에서 시작할 수는 없습니다. 여기에 AsyncTask를은 다음과 같습니다 - 여기SupportfragmentManager가 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") 
      } 
     } 
    } 

} 

가 showAlertDialog() 함수입니다 : - 여기

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

는 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 
    } 
} 

누군가가 나를 도와주세요 수 있습니다. Java의 응답도 괜찮습니다.

MainActivity().showAlertDialog(...) 

수행되어야 하는지를 명확하지 않은 새로운 활동 객체 생성 : 당신의 postExecute 기능에

답변

0

이것을 위해 관찰자 패턴을 사용할 수 있습니다.

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

을이 줄을 추가하는

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

같은 인터페이스를 작성하고 활동 그래서

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

는 다음과 같은 코드가 있습니다. 해당 객체가 새로 생성되어 안드로이드에 의해 제대로 초기화되지 않기 때문에 supportFragmentManager와 같은 내부 객체가 초기화되지 않아보고있는 null이됩니다.

+0

어떻게해야합니까에서 실행? –

+0

일반적으로 사람들은 부모 작업의 WeakReference를 AsyncTask에 저장하고, 활동에 대한 어떤 것을 호출해야한다면'postExecute'에서 그 참조에 접근한다. – Kiskae

+0

어떤 예제 나 코드를 제공 할 수 있습니까? 나는 멍청하다. –