2015-12-30 78 views
1

伙计我在应用程序中执行错误处理时遇到问题。 我想要显示错误消息给我的应用程序的用户时,来自休息的响应代码不是200.换句话说:如果连接错误,我想显示消息,用户必须检查他的互联网连接然后再试一次。如果一切正常,我想像往常一样做所有事情,以便加载内容。Android Studio应用程序向用户显示错误消息

我写的是这样的:

Toast errorToast = Toast.makeText(NewsActivity.this, "Error, pls chech your internet connection and try again!", Toast.LENGTH_SHORT); 
errorToast.show(); 

这:

if(response.getStatusLine().getStatusCode() == 200){} 

但我不知道这是很好的代码,我应该在哪里插入。我将非常感谢您的帮助和建议。

这是此代码:

public class NewsActivity extends Activity { 

private static final String URL = "http://10.0.2.2:8083/rest/aktualnosci"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_news); 

    new FetchItems().execute(); 
} 

private class FetchItems extends AsyncTask<String, Void, JSONArray> { 

    protected JSONArray doInBackground(String... params) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet httpget = new HttpGet(URL); 
     httpget.setHeader("Content-type", "application/json"); 

     JSONArray json = new JSONArray(); 

     try { 
      HttpResponse response = httpclient.execute(httpget); 
       json = new JSONArray(EntityUtils.toString(response.getEntity())); 
       return json; 
      } 

     } catch (Exception e) { 
      Log.v("Błędne wczytanie", e.getMessage()); 
     } 

     return json; 
    } 

    protected void onPostExecute(JSONArray result) { 
     ListView lst = (ListView) findViewById(R.id.aktualnosci_list); 
     ArrayList<String> listItems = new ArrayList<String>(); 
     String contentToEdit; 
     String titleContainer; 
     TextView newsHeaderTextView = null; 
     for (int i = 0; i < result.length(); i++) { 
      try { 
       titleContainer = result.getJSONObject(i).getString("title").toString(); 
       listItems.add(titleContainer); 
       contentToEdit=result.getJSONObject(i).getString("body").toString(); 
       contentToEdit= Html.fromHtml(contentToEdit).toString(); 
       listItems.add(contentToEdit); 

      } catch (Exception e) { 
       Log.v("Błędne wczytanie1", e.getMessage()); 
      } 
     } 

     ArrayAdapter ad = new ArrayAdapter(NewsActivity.this, android.R.layout.simple_list_item_1, listItems); 
     lst.setAdapter(ad); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

}

+0

如果要检查网络连接呼叫呼叫您的AsyncTask前敬酒。如果你想显示吐司根据服务器的响应调用onPostExecute。 – ajantha

+0

你想检查互联网连接..? – Nils

+0

所以我应该如何修改我的if指令?响应仅在类FetchItems中设置了扩展AsyncTask,并且它不会被超越? – bodley

回答

4

可以在doInBackground方法添加此。

runOnUiThread(new Runnable() { 
         public void run() { 
          if (response.getStatusLine().getStatusCode() != 200) { 
           Toast errorToast = Toast.makeText(NewsActivity.this, "Error, pls chech your internet connection and try again!", Toast.LENGTH_SHORT); 
           errorToast.show(); 
          } 

         } 
        }); 
+1

我认为使用Runnable影响UI线程是一种不好的做法。 – ajantha

+0

无法在没有UI线程的doInBackground方法中显示Toast消息。 –

+0

所以这是个坏主意?你有其他吗? :) – bodley

0

/* 我想你的代码工作正常,做了一些改动按需要 */

public class NewsActivity extends Activity { 

private static final String URL = "http://10.0.2.2:8083/rest/aktualnosci"; 
String jsonArrayString = ""; 
String message = "Error, pls check your internet connection and try again!"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_news); 

    new FetchItems().execute(this); 
} 

private class FetchItems extends AsyncTask<Context,Void,String>{ 
    Context temp; 


    @Override 
    protected String doInBackground(Context... params) { 
     temp = params[0]; 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet httpget = new HttpGet(URL); 
     httpget.setHeader("Content-type", "application/json"); 

     JSONArray json = new JSONArray(); 

     try { 
      HttpResponse response = httpclient.execute(httpget); 

      if(response.getStatusLine().getStatusCode() == 200) { 
       json = new JSONArray(EntityUtils.toString(response.getEntity())); 
       jsonArrayString += json.toString(); 
       return jsonArrayString; 
      } 
      } 
      catch (Exception e) { 
       Log.v("Błędne wczytanie", e.getMessage()); 
      } 
    return message; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     ListView lst = (ListView) findViewById(R.id.aktualnosci_list); 
     ArrayList<String> listItems = new ArrayList<String>(); 
     String contentToEdit; 
     String titleContainer; 
     TextView newsHeaderTextView = null; 

     if(!message.equals(s)) 
     { 
      JSONArray result = null; 
      try { 
       result = new JSONArray(s); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      for (int i = 0; i < result.length(); i++) { 
      try { 
       titleContainer = result.getJSONObject(i).getString("title").toString(); 
       listItems.add(titleContainer); 
       contentToEdit=result.getJSONObject(i).getString("body").toString(); 
       contentToEdit= Html.fromHtml(contentToEdit).toString(); 
       listItems.add(contentToEdit); 

      } catch (Exception e) { 
       Log.v("Błędne wczytanie1", e.getMessage()); 
      } 
     } 

     ArrayAdapter ad = new ArrayAdapter(NewsActivity.this, android.R.layout.simple_list_item_1, listItems); 
     lst.setAdapter(ad); 
    } 
     else 
     { 
      Toast.makeText(temp,message,Toast.LENGTH_LONG).show(); 
     } 

    } 
} 
}