2016-03-26 10 views
0

Erläuterung:Wie kann ich mit Ausnahme umgehen, wenn ich asynctask in Android verwende?

ich einen Web-Service für meinen application.In verwenden, das jede Anfrage ist> GET-Methode. Erstellen Sie also eine Klasse, in der ich auch eine Methode zum Festlegen der URL erstellen und die Antwort vom Server abrufen kann.

Hier ist meine Klasse, die die Antwort vom Server erhalten.

package adapter; 

import android.content.Context; 
import android.util.Log; 
import android.widget.Toast; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.UnknownHostException; 


public class CallAPI { 
    private Context context; 
    public String GetResponseGetMethod(String url) { 
     URL obj; 
     String Response=""; 
     String getMethodResponse = ""; 
     try { 
      obj = new URL(url); 
      HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
      con.setRequestMethod("GET"); 
      int responseCode = con.getResponseCode(); 
      Log.e("GET Response Code :: " , ""+responseCode); 
      if (responseCode == HttpURLConnection.HTTP_OK) { // success 
       BufferedReader in = new BufferedReader(new InputStreamReader(
         con.getInputStream())); 
       String inputLine; 
       StringBuffer response = new StringBuffer(); 

       while ((inputLine = in.readLine()) != null) { 
        response.append(inputLine+"\n"); 
       } 
       in.close(); 

       // print result 
       getMethodResponse=response.toString(); 
       Log.e("Response",response.toString()); 
      } else { 
       Log.e("GET request not worked",""); 
      } 
     } 

     catch (MalformedURLException e) { 
      Toast.makeText(context, "YEs got it", Toast.LENGTH_LONG).show(); 
     } 
     catch (IOException e){ 
      Toast.makeText(context, "YEs Inside IO it", Toast.LENGTH_LONG).show(); 
     } 
     return getMethodResponse; 
    } 
} 

Über der Klasse erhalten Antwort.

Hier ist meine Klasse, wo ich Asynktask verwendet

public class TabJson extends AsyncTask<String, String, String> { 

    String jsonStr = ""; 

    @Override 
    protected void onPreExecute() { 
     Utils.Pdialog(getContext()); 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     jsonStr = new CallAPI().GetResponseGetMethod(url); 
     if (jsonStr != null) { 
      try { 
       JSONObject obj = new JSONObject(jsonStr); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    } 
} 

Manchmal dauert es zu Zeitverhalten zu bekommen.

MyQuestion ist:

Wie kann ich mit dieser Situation umgehen, wenn es zu Zeit in Anspruch nimmt response.It zu bekommen> auch eine Ausnahme wie unknowhostapi angehoben.

Wie kann ich von diesem Problem zu überwinden.Bitte helfen Sie mir, dieses Problem zu lösen.

+0

kann auch den Code, wie Sie diese Methode verwenden ? wie in 'asynctask'? –

+0

Sie müssen asynctask verwenden. http://developer.android.com/reference/android/os/AsyncTask.html – learner

+0

Ich habe meinen Beitrag bearbeitet siehe –

Antwort

1

@Milan in Ihrem callAPI Klasse einen Wert zu getMehodResponse in catch-Blöcke als folgt-

public class CallAPI { 
private Context context; 
public String GetResponseGetMethod(String url) { 
    URL obj; 
    String Response=""; 
    String getMethodResponse = ""; 
    try { 
     obj = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
     con.setRequestMethod("GET"); 
     int responseCode = con.getResponseCode(); 
     Log.e("GET Response Code :: " , ""+responseCode); 
     if (responseCode == HttpURLConnection.HTTP_OK) { // success 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        con.getInputStream())); 
      String inputLine; 
      StringBuffer response = new StringBuffer(); 

      while ((inputLine = in.readLine()) != null) { 
       response.append(inputLine+"\n"); 
      } 
      in.close(); 

      // print result 
      getMethodResponse=response.toString(); 
      Log.e("Response",response.toString()); 
     } else { 
      Log.e("GET request not worked",""); 
     } 
    } 

    catch (MalformedURLException e) { 
     getMethodResponse="Malformed"; 
     Toast.makeText(context, "YEs got it", Toast.LENGTH_LONG).show(); 
    } 
    catch (IOException e){ 
     getMethodResponse="IO"; 
     Toast.makeText(context, "YEs Inside IO it", Toast.LENGTH_LONG).show(); 
    } 
    return getMethodResponse; 
} 
} 

In TabJson Klasse Rückkehr zuweisen in doInBackground folgenden Methoden-

@Override 
    protected String doInBackground(String... params) { 

     jsonStr = new CallAPI().GetResponseGetMethod(url); 


     return jsonStr; 
    } 

In TabJson Klasse verwenden Sie folgenden Code in onPostExecute-Methode

@Override 
    protected void onPostExecute(String s) { 
    if (s != null) { 
      try { 
       JSONObject obj = new JSONObject(jsonStr); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
       //Show pop up or alert msg here. 
      } 
      } 
     switch(s){ 
        case "IO": 
        //Do what you want to show your user. 
        break; 
        case "Malformed": 
        //Do what you want to show your user. 
        break; 
       } 
     super.onPostExecute(s); 
    } 
0

@Milan Ich sehe keine AsyncTask in Ihrem Code. Wenn Sie Schritten- diese

1.extend AsyncTask

2.override doInBackground() und PostExecute Methode implementieren wollen folgen AsyncTask Aufgabe.

  1. tun Sie Ihre Arbeit in doInBackground und erhalten Antwort vom Server.

  2. in postExecute behandeln Ihre Ausnahme entsprechend Ihrem Antwortstatus.

-1

Verwendung Async Task und auch die Erlaubnis des Internet in Ihrer Manifest-Datei hinzufügen.

<uses-permission android:name="android.permission.INTERNET" /> 
0

Sie müssen auf Ihre Funktion machen, die mit dem Server zurückgeben einig Objekt behandelt, die alle möglichen Ergebnisse enthalten können, nicht nur den Erfolg Fall. So zum Beispiel:

class Results { 
    public String result; 
    public Err error; 
    public enum Err { 
     OK, ERR1, ERR2, ERR3 
    } 
} 

Also, wenn alles in Ordnung ist, setzen Sie das Ergebnis String an die Reaktion und die Fehler Enum OK. Oder wenn es einen anderen Fehler gibt, verwenden Sie eine andere Definition Ihrer Definition. In Ihrem Code, der das Ergebnis empfängt, können Sie den Fehlertyp überprüfen, um zu bestimmen, was damit zu tun ist.

+0

ich kann nicht verstanden –

0

Es gibt einige Probleme mit Ihrem Code:

protected String doInBackground(String... params) { 

      jsonStr = new CallAPI().GetResponseGetMethod(url); 
      if (jsonStr != null) { 
       try { 
        JSONObject obj = new JSONObject(jsonStr); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

Sie null zurückkehren. String wird stattdessen zurückgegeben.

protected String doInBackground(String... params) { 

      jsonStr = new CallAPI().GetResponseGetMethod(url); 

      return jsonStr; 
     } 

nun in der Post, ausführen Format es in JSONObject wie folgt aus:

@Override 
     protected void onPostExecute(String s) { 

      if (s != null) { 
        try { 
         JSONObject obj = new JSONObject(s); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
     } 

Jetzt, Sie JSONobject obj haben. Mach etwas damit.

+0

Was ist es zurück? Ist es Antwort Antwort? –

+0

Nach Ihrer Bearbeitung macht meine Antwort keinen Sinn. Sie verwenden in Ihrem Code bereits asynctask. – learner

+0

Kann ich einstellen, dass meine asynctask nur für 10 Sekunden ausgeführt wird, nachdem sie 10 Sekunden lang ausgeführt wurde? Ist es möglich? –

Verwandte Themen