当我在android中使用asynctask时如何处理异常?

时间:2016-03-26 05:22:46

标签: android android-asynctask

说明:

  

我正在为我的应用程序使用Web服务。其中,每个请求都是>使用GET方法。所以创建一个类,我在其中创建方法来设置> url并从服务器获取响应。

这是我的课程,它从服务器获得响应。

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

上课得到回应。

以下是我使用 Asynktask

的课程
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);
    }
}

有时需要时间才能得到回应。

MyQuestion是:

  

如果需要花费太多时间来获得响应,我该如何处理这种情况呢。它还引发了像unknowhostapi这样的异常。

我如何克服这个问题。请帮我解决这个问题。

5 个答案:

答案 0 :(得分:1)

你的callAPI类中的@Milan为catch块中的getMehodResponse分配了一些值,如下所示 -

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

在TabJson类中,在doInBackground方法中返回以下内容 -

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

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


        return jsonStr;
    }

在TabJson类中,在onPostExecute方法中使用以下代码 -

@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);
    }

答案 1 :(得分:0)

@Milan我在你的代码中没有看到任何AsyncTask。如果要实现AsyncTask任务,请按照以下步骤操作 -

1.extend AsyncTask

2.override doInBackground()和postExecute方法。

  1. 在doInBackground中完成工作并从服务器获取响应。

  2. postExecute中的
  3. 根据您的回复状态处理您的例外。

答案 2 :(得分:0)

您必须使处理服务器的函数返回一些可能包含所有可能结果的对象,而不仅仅是成功案例。例如:

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

因此,如果一切正常,则将结果字符串设置为响应,并将错误枚举设置为OK。或者,如果存在其他错误,请使用您定义的另一个枚举。在接收结果的代码中,您可以检查错误类型以确定如何处理它。

答案 3 :(得分:0)

您的代码存在一些问题:

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

您将返回null。改为返回字符串。

protected String doInBackground(String... params) {

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

            return jsonStr;
        }

现在,在post执行中,将其格式化为jsonObject,如下所示:

 @Override
        protected void onPostExecute(String s) {

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

现在,你有JSONobject obj。用它做点什么。

答案 4 :(得分:-1)

使用Async Task并在您的清单文件中添加互联网权限。

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