2017-10-19 1 views
0

This AsyncTask class should be static or leaks might occur누출이없는 AsyncTask

왜 내 AsyncTask가 작동하지 않습니까?

전화 :PlacesTask(this).execute(...)

코드 :

private class PlacesTask internal constructor(activity: MainActivity) : AsyncTask<String, Int, String>() { 
     var data: String? = null 
     private val mRef: WeakReference<MainActivity> = WeakReference(activity) 

     override fun doInBackground(vararg url: String): String? { 
      try { 
       data = MainActivity().downloadUrl(url[0]) 
      } catch (e: Exception) { 
       Log.d("Background Task", e.toString()) 
      } 
      return data 
     } 

     override fun onPostExecute(result: String) { 
      val asyncTaskLeak = mRef.get() 
      if (asyncTaskLeak != null) SetPlaceTask().execute(result) 
     } 
    } 

    private class SetPlaceTask : AsyncTask<String, Int, List<HashMap<String, String>>>() { 
     var places: List<HashMap<String, String>>? = null 

     override fun doInBackground(vararg jsonData: String): List<HashMap<String, String>>? { 
      try { 
       places = PlaceJSONParser().parse(JSONObject(jsonData[0])) 
      } catch (e: Exception) { 
       Log.d("Exception", e.toString()) 
      } 
      return places 
     } 

     override fun onPostExecute(list: List<HashMap<String, String>>) { 
      ... 
     } 
    } 

@Throws(IOException::class) 
    private fun downloadUrl(strUrl: String): String { 
     var data = "" 
     var iStream: InputStream? = null 
     var urlConnection: HttpURLConnection? = null 
     try { 
      urlConnection = URL(strUrl).openConnection() as HttpURLConnection 
      urlConnection.connect() 
      iStream = urlConnection.inputStream 
      val br = BufferedReader(InputStreamReader(iStream!!)) 
      val sb = StringBuilder() 
      var line: String? = null 
      while ({line = br.readLine(); line }() != null) sb.append(line) 
      data = sb.toString() 
      br.close() 
     } catch (e: Exception) { 
      Log.d("downloading url", e.toString()) 
     } finally { 
      if (iStream != null) iStream.close() 
      if (urlConnection != null) urlConnection.disconnect() 
     } 
     return data 
    } 

Error: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter result

이 도와주세요. 내가 뭘 놓치고 있니?

답변

0

나는 이해했다. >companion object {} -

  1. AsyncTask는에 static
  2. AsyncTask 이동해야합니다.
  3. WeakReference - 누출이없는 AsyncTask를 들어

예 (좋은 특급.) : AsyncTask를 누출

없이
override fun onPause() { 
     super.onPause() 
     ... 
     when { 
      placesTask != null -> { 
       placesTask!!.cancel(true) 
       placesTask = null 
      } 
      setPlacesTask != null -> { 
       setPlacesTask!!.cancel(true) 
       setPlacesTask = null 
      } 
     } 
} 
    ... 

    @Throws(IOException::class) 
    private fun downloadUrl(strUrl: String): String { 
     var data = "" 
     var iStream: InputStream? = null 
     var urlConnection: HttpURLConnection? = null 
     try { 
      urlConnection = URL(strUrl).openConnection() as HttpURLConnection 
      urlConnection.connect() 
      iStream = urlConnection.inputStream 
      val br = BufferedReader(InputStreamReader(iStream!!)) 
      val sb = StringBuilder() 
      var line: String? = null 
      while ({line = br.readLine(); line }() != null) sb.append(line) 
      data = sb.toString() 
      br.close() 
     } catch (e: Exception) { 
      Log.d("downloading url", e.toString()) 
     } finally { 
      if (iStream != null) iStream.close() 
      if (urlConnection != null) urlConnection.disconnect() 
     } 
     return data 
    } 

companion object { 
    ... 
    var placesTask: PlacesTask? = null 
    var setPlacesTask: SetPlaceTask? = null 

    class PlacesTask(mainActivity: MainActivity) : AsyncTask<String, Int, String>() { 
      private val mRef: WeakReference<MainActivity> = WeakReference(mainActivity) 

      override fun doInBackground(vararg url: String): String? { 
       var data: String? = null 
       try { 
        data = mRef.get()?.downloadUrl(url[0]) 
       } catch (e: Exception) { 
        Log.d("Background Task", e.toString()) 
       } 
       return data 
      } 

      override fun onPostExecute(result: String) { 
       setPlacesTask = SetPlaceTask(mRef.get()!!).execute(result) as SetPlaceTask? 
      } 
     } 

     class SetPlaceTask(mainActivity: MainActivity) : AsyncTask<String, Int, List<HashMap<String, String>>>() { 
      private val mRef: WeakReference<MainActivity> = WeakReference(mainActivity) 

      override fun doInBackground(vararg jsonData: String): List<HashMap<String, String>>? { 
       var places: List<HashMap<String, String>>? = null 
       try { 
        places = PlaceJSONParser().parse(JSONObject(jsonData[0])) 
       } catch (e: Exception) { 
        Log.d("Exception", e.toString()) 
       } 
       return places 
      } 

      override fun onPostExecute(list: List<HashMap<String, String>>) { 
       for (i in list.indices) { 
        val hmPlace = list[i] 
        mRef.get()?.parkingLatLng = LatLng(hmPlace["lat"]!!.toDouble(), hmPlace["lng"]!!.toDouble()) 
        mRef.get()?.mMarkerPlaceLink!!.put(mRef.get()?.map!!.addMarker(MarkerOptions().icon(mRef.get()?.vectorToBitmap(R.drawable.ic_local_parking_black_12dp, ContextCompat.getColor(mRef.get()?.applicationContext, R.color.colorPrimaryDark))).position(mRef.get()?.parkingLatLng!!).title(hmPlace["place_name"] + "\n" + hmPlace["vicinity"])).id, hmPlace["reference"].toString()) 
        mRef.get()?.map!!.addCircle(CircleOptions().center(mRef.get()?.parkingLatLng).radius(1.0).strokeColor(Color.BLACK).fillColor(Color.WHITE).strokeWidth(1f).zIndex(1f)) 
       } 
      } 
     } 
} 

전화 :placesTask = PlacesTask(this).execute("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location="...) as PlacesTask?

행운을 빕니다!

2

예외로, null이 아닌 것으로 정의한 동안 resultnull입니다. 그 이후 파라미터

downloadUrlnull 같이 data 변수를두고, 예외가 발생했습니다 있기 때문에 일어나는 doInBackground 의해 리턴 된 값이다. 예외가 발생하면

  1. doInBackground가 널을 반환하지 않는다는 것을 확인하고, null이 아닌 기본 반환 값을 정의합니다

    를 해결하려면 다음 옵션 중 하나를 수행합니다.

  2. onPostExecute의 매개 변수 유형을 String?으로 변경하고 예외 발생시 null 일 수있는 경우를 처리하십시오.