簡體   English   中英

異步任務使我的應用程序崩潰

[英]Async task made my application crashes

首先,我所看到的兩個問題第一 第二

但是它們是不同的,我使用Async task與服務器端進行通信,除了兩種情況外,它都可以正常工作:第一種情況是如果服務器由於任何原因導致應用程序崩潰而停止,第二種情況是當我連接到網絡但沒有互聯網時在此訪問點上, 我的問題是如何處理此錯誤以避免崩潰? 這是我的代碼

    public class news_tab extends Fragment{
    ListView newsLIST;
    String result_news,result_fav;
    String [] Hot_news,newsName1,newsText1 ,agentName;
    int [] Hot_news_id,agent_id;
    int []  fav_id;
    private Context context;
    ArrayList<String> newsName,newsText,agentNamelist;
    public news_tab()
    {

    }
    public news_tab (Context context)
    {

        this.context=context;
        newsName=new ArrayList<String>();
        newsText=new ArrayList<String>();
        agentNamelist=new ArrayList<String>();
    }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.news, container, false);
            rootView.setBackground(Drawable.createFromPath("@drawable/back"));
            newsLIST=(ListView)rootView.findViewById(R.id.newsLV);
            getFavouriteNews();
            news();


            return rootView;
        }
public void getFavouriteNews() {
        new AsyncTask<Void, Void, Void>() {


            @Override
            protected Void doInBackground(Void... voids) {
                try {
                    if(isNetworkAvailable()) {
                        HttpRequestSender http = new HttpRequestSender((Activity) context);
                        result_fav = http.SEND_POST_get_news_fav("**********/dal/login.asmx/getdata_newsfav");
                    }
                    else
                    {
                        result_fav="";
                        Toast.makeText(context,"Check the internet Connection",Toast.LENGTH_SHORT).show();
                    }
                    //  result = http.SEND_Check("******/Login?email="
                    //      +username.getText().toString()+"&password="+password1.getText().toString());

                    Log.d("String", result_fav);


                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPreExecute() {



                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(Void aVoid) {

                if(result_fav.contains("text_news")) {

                    //   x.cancel();
                   // Toast.makeText(context, "Welcome Favourite", Toast.LENGTH_SHORT).show();
                    // JSONObject jb = null;
                    try {
                        JSONArray JA = new JSONArray(result_fav);
                        ArrayList <String> newsName , newsText,agentNamelist,urlList;

                        fav_id= new int [JA.length()];


                        for (int i = 0; i < JA.length(); i++) {
                            JSONObject JO = (JSONObject) JA.get(i);

                            fav_id[i]= (int)   JO.get("news_id");


                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
                else
                {
                   // Toast.makeText(context,"No News",Toast.LENGTH_SHORT).show();

                }
                super.onPostExecute(aVoid);

            }
        }.execute();

    }
    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager
                = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }

最后我得到了這個錯誤

03-29 10:15:45.500 24585-24585/com.Offferly.ahmad.hakimi E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.Offferly.ahmad.hakimi, PID: 24585
java.lang.NullPointerException
   at com.Offferly.ahmad.hakimi.tab.news_tab$2.onPostExecute(news_tab.java:217)
   at com.Offferly.ahmad.hakimi.tab.news_tab$2.onPostExecute(news_tab.java:179)
   at android.os.AsyncTask.finish(AsyncTask.java:632)
   at android.os.AsyncTask.access$600(AsyncTask.java:177)
   at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:146)
   at android.app.ActivityThread.main(ActivityThread.java:5692)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
   at dalvik.system.NativeStart.main(Native Method)
03-29 10:15:45.540 2952-20003/? E/WakeLock: release without a matched acquire!

您不能在doInBackground()方法內顯示Toast。 如果要執行此操作,請使用以下代碼。

runOnUiThread(new Runnable() {
    public void run() {
       Toast.makeText(<your class name>.this, "Cool Ha?", Toast.LENGTH_SHORT).show();
}});

嘗試這個。

  1. 如果服務器由於任何原因導致您在result_fav變量中獲得空響應而停止,則需要在onPostExecute()方法中處理null

    如果(!TextUtils.isEmpty(result_fav)){

    //您的代碼

    }其他{

    //顯示吐司無效響應

    }

  2. 在第二種情況下

在doInBackground()方法中刪除Toast消息。在doInBackground()方法中無法顯示Toast消息

您可以在getFavouriteNews()方法中嘗試以下方法:

if(isNetworkAvailable()) {
  //then call your async task                      
}

else
{
  //Show Toast no internet                      
}

更改您的if條件

if(result_fav.contains("text_news"))

 if(!TextUtil(result_fav) && result_fav.contains("text_news"))

從doinbackground移除吐司。 您應該在ui thread.code上運行它,如下所示

     @Override
   protected Void doInBackground(Void... voids) {
          try {
          if(isNetworkAvailable()) {
       HttpRequestSender http = new HttpRequestSender((Activity) context);
result_fav = http.SEND_POST_get_news_fav("**********/dal/login.asmx/getdata_newsfav");
                        }
                        else
                        {
                            result_fav="";


      runOnUiThread(new Runnable() {
            public void run() {
              Toast.makeText(context,"Check the internet Connection",Toast.LENGTH_SHORT).show();
        }});
                        }
                        //  result = http.SEND_Check("******/Login?email="
                        //      +username.getText().toString()+"&password="+password1.getText().toString());

                        Log.d("String", result_fav);


                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return null;
                }

onViewCreated中而不是onCreateView運行AsyncTask。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM