Catch errore in AsyncTask

di il
6 risposte

Catch errore in AsyncTask

Ciao a tutti,
sto iniziando a studiare kotlin per realizzare applicazioni android

Oggi sto cercando di collegarmi ad un API per prendere delle informazioni
L'api é gratuita.
Per il codice ho seguito un tutorial ma purtroppo non capisco l'errore, perché nonostante abbia messo un infinita di breakpoint come richiama il metodo asincrono va in errore


package com.test.apimeteo

import android.os.AsyncTask
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader
import java.lang.Exception
import java.net.HttpURLConnection
import java.net.URL
import kotlin.math.log

class MainActivity : AppCompatActivity() {

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

    fun GetSunset(view: View){

        val appid="19cfcc9079d94b33fc8c188b4b5bb622"
        var city = txtCity2.text.toString()
        val url = "https://api.openweathermap.org/data/2.5/weather?q=$city&appid=$appid"
        MyAsyncTask().execute(url)
    }

    inner class MyAsyncTask: AsyncTask<String, String, String>() {
        override fun doInBackground(vararg params: String?): String {
            try {
                var url = URL(params[0])
                var urlConnect =  url.openConnection() as HttpURLConnection
                urlConnect.connectTimeout =7000

                var inString = ConvertStreamToString(urlConnect.inputStream)
                //txtResult
                publishProgress(inString)
            }
            catch (ex: Exception)
            {
                Log.e("ERRORMyAsyncTask", ex.message.toString())


            }

            return " "
        }

        override fun onPreExecute() {
            //
        }

        override fun onProgressUpdate(vararg values: String?) {
            //  super.onProgressUpdate(*values)
            try {
                var json = JSONObject(values[0])
                var coord = json.getJSONObject("coord")
                var meteo = coord.getJSONObject("results")
                var description = meteo.getJSONObject("description")

                txtResult.text ="" +description


            }
            catch (ex: Exception){
                Log.e("ERRORonProgressUpdate", ex.message.toString())
            }
        }

        override fun onPostExecute(result: String?) {

            //after task done
        }


    }

    fun ConvertStreamToString(inputStream: InputStream):String {
        val bufferReader = BufferedReader(InputStreamReader(inputStream))
        var line: String
        var allString:String=""
        try {
            do {

                line= bufferReader.readLine()
                if ( line != null){
                    allString += line
                }
            }while ( line != null)
            inputStream.close()
        }
        catch (ex: Exception)
        {
            Log.e("ERRORConvertStreamTo", ex.message.toString())

        }

        return allString
    }

}
praticamente io arrivo a MyAsyncTask().execute(url)
e mi va in errore finendo direttamente qui

public void onClick(@NonNull View v) {
    if (mResolvedMethod == null) {
        resolveMethod(mHostView.getContext(), mMethodName);
}

    try {
        mResolvedMethod.invoke(mResolvedContext, v);
} catch (IllegalAccessException e) {
        throw new IllegalStateException(
                "Could not execute non-public method for android:onClick", e);
} catch (InvocationTargetException e) {
        throw new IllegalStateException(
                "Could not execute method for android:onClick", e);
}
}


nella classe AppCompatViewInflater di androidx.appcompat.app;

Sapete darmi qualche suggerimento per intercettare l'errore o dove ho sbagliato?
Grazie

6 Risposte

  • Re: Catch errore in AsyncTask

    Ciao, potesti includere lo stack trace (che puoi ottenere da LogCat)?
  • Re: Catch errore in AsyncTask

    Ti allego il log,
    spero che sia quello che mi hai chiesto

    tra gli errori che leggo
    2020-03-18 10:58:45.559 1852-1852/? E/wifi_forwarder: RemoteConnection failed to initialize: RemoteConnection failed to open pipe


    potrebbe essere questo?
    ma la connessione ce l'ho e l'api chiamata via browser funziona correttamente

    nel file manifest ho inserito questo
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    Grazie
  • Re: Catch errore in AsyncTask

    Della ha scritto:


    Ciao, potesti includere lo stack trace (che puoi ottenere da LogCat)?
    
    03/18 11:33:57: Launching 'app' on Pixel 2 API 29.
    $ adb shell am start -n "com.andrea.apimeteo/com.andrea.apimeteo.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D
    Waiting for application to come online: com.andrea.apimeteo.test | com.andrea.apimeteo
    Waiting for application to come online: com.andrea.apimeteo.test | com.andrea.apimeteo
    Waiting for application to come online: com.andrea.apimeteo.test | com.andrea.apimeteo
    Connecting to com.andrea.apimeteo
    Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
    W/ActivityThread: Application com.andrea.apimeteo is waiting for the debugger on port 8100...
    I/System.out: Sending WAIT chunk
    I/System.out: Debugger has connected
        waiting for debugger to settle...
    Connected to the target VM, address: 'localhost:8612', transport: 'socket'
    I/System.out: waiting for debugger to settle...
    I/chatty: uid=10141(com.andrea.apimeteo) identical 3 lines
    I/System.out: waiting for debugger to settle...
    I/System.out: waiting for debugger to settle...
    I/System.out: waiting for debugger to settle...
    I/System.out: debugger has settled (1452)
    D/libEGL: Emulator has host GPU support, qemu.gles is set to 1.
    W/RenderThread: type=1400 audit(0.0:104): avc: denied { write } for name="property_service" dev="tmpfs" ino=7420 scontext=u:r:untrusted_app:s0:c141,c256,c512,c768 tcontext=u:object_r:property_socket:s0 tclass=sock_file permissive=0
    W/libc: Unable to set property "qemu.gles" to "1": connection failed; errno=13 (Permission denied)
    D/libEGL: loaded /vendor/lib/egl/libEGL_emulation.so
    D/libEGL: loaded /vendor/lib/egl/libGLESv1_CM_emulation.so
    D/libEGL: loaded /vendor/lib/egl/libGLESv2_emulation.so
    W/andrea.apimete: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
    W/andrea.apimete: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
    D/HostConnection: HostConnection::get() New Host Connection established 0xdef84e10, tid 17430
    D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_0 
    W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
    D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0
    D/EGL_emulation: eglCreateContext: 0xea07f2e0: maj 3 min 0 rcv 3
    D/EGL_emulation: eglMakeCurrent: 0xea07f2e0: ver 3 0 (tinfo 0xea089cf0)
    W/Gralloc3: mapper 3.x is not supported
    D/HostConnection: createUnique: call
    D/HostConnection: HostConnection::get() New Host Connection established 0xdef87cf0, tid 17430
        HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_0 
    D/eglCodecCommon: allocate: Ask for block of size 0x1000
    D/eglCodecCommon: allocate: ioctl allocate returned offset 0x3ffff6000 size 0x2000
    D/EGL_emulation: eglMakeCurrent: 0xea07f2e0: ver 3 0 (tinfo 0xea089cf0)
    D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 1 0
    I/Choreographer: Skipped 46 frames!  The application may be doing too much work on its main thread.
    I/OpenGLRenderer: Davey! duration=799ms; Flags=0, IntendedVsync=14798357613451, Vsync=14799124280087, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=14799129026600, AnimationStart=14799129210200, PerformTraversalsStart=14799132035400, DrawStart=14799149238100, SyncQueued=14799154715400, SyncStart=14799155222400, IssueDrawCommandsStart=14799155441400, SwapBuffers=14799156728400, FrameCompleted=14799157532100, DequeueBufferDuration=52000, QueueBufferDuration=237000, 
    I/Choreographer: Skipped 188 frames!  The application may be doing too much work on its main thread.
    D/NetworkSecurityConfig: No Network Security Config specified, using platform default
    
    
  • Re: Catch errore in AsyncTask

    Ciao, nel LogCat che hai postato non vedo alcun errore, quindi deve essere in un'altra porzione che non hai postato. L'errore che hai postato prima invece non credo contenga particolari informazioni relative al tuo codice, quindi purtroppo non è di molto aiuto (poi è relativo a wifi_forwarder, quindi non credo c'entri molto con la tua app)
  • Re: Catch errore in AsyncTask

    Della ha scritto:


    Ciao, nel LogCat che hai postato non vedo alcun errore, quindi deve essere in un'altra porzione che non hai postato. L'errore che hai postato prima invece non credo contenga particolari informazioni relative al tuo codice, quindi purtroppo non è di molto aiuto (poi è relativo a wifi_forwarder, quindi non credo c'entri molto con la tua app)

    Avevi ragione, il problema non era nella connessione, anche se non sono riuscito a capire come intercettarlo.
    il problema era nel trattare lo streaming con readiline

    ho creato un'altra API di test
    dove ho spostato tutto in delle singole funzioni che non ho chiamato tramite AsyncTask ma tramite doAsync
    e sono riuscito tramite debug a capire che il problema era prima qui
    do {

    line= bufferReader.readLine()
    if ( line != null){
    allString += line
    }
    }while ( line != null)

    e poi
    sul prendere la variabile dal json, ma li ancora non ci arrivava perché andava in crash prima

    ho modificato il codice con
    var line = inputStream.bufferedReader().use(BufferedReader::readText)

    in precedenza avevo tentato anche questo
    while (line != null) {
    content.append(line)

    if(line!= null)
    {
    allString += line
    }
    line = inputStream.bufferedReader().use(BufferedReader::readText)
    }

    ma mi va sempre in Exception nonostante il codice l'ho visto postato su molto siti e

    nel caso attuale avendo una sola riga di json riesco a lavorarci, nel secondo caso ovvero quello che non funziona prevedo di ciclare in caso di trovare più righe
    l'errore che ricevo é “IOException: Stream closed”

    Grazie
  • Re: Catch errore in AsyncTask

    Ciao, penso che il problema sia dovuto al fatto che ".use(..)" chiude lo stream su cui è invocata dopo aver eseguito la funzione che prende come argomento. Visto che lo stream è utilizzato all'interno del loop, la seconda volta che cerchi di usarlo l'eccezione viene lanciata.

    Comunque il loop non ti serve perché "readText" legge tutto il contenuto dello stream e lo restituisce sotto forma di stringa, per cui potresti direttamente fare una cosa tipo:
    
    val content = inputStream.bufferedReader().use(BufferedReader::readText)
    
Devi accedere o registrarti per scrivere nel forum
6 risposte