我开发了一个Android RSS阅读器。我创建了一个标签布局,并为每种类型的新闻创建了每个标签(比如标题,国家,国际等)。
然后我在tablayout的第一页上的自定义列表视图中列出了RSS标题及其图像。 见下图。
现在,当用户点击新闻标题时,将打开另一个活动(页面),其中包含新闻说明。
我的问题是当用户点击标签并加载时,如果互联网连接不可用,我想显示一个带有两个按钮的对话框,Retry&退出。
当用户点击重试时,应重新加载活动。我使用了一种方法(if(International.Title == null))。但我不认为这是一种正确的方法。我想知道是否有检查网络是否可用的更好解决方案......
这是我的代码,
public class International extends Activity {
static final String URL = "http://www.abcd.com/en/taxonomy/term/3/0/feed";
static final String KEY_HEAD = "item";
static final String KEY_DATE = "pubDate";
ListView list;
InternationalAdapter adapter;
public static String[] Title;
public static String[] Description;
public static String[] image;
public static String[] Date;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.headlines);
Bundle mybundle = new Bundle();
mybundle.putString("number", "0");
new DoInBackground().execute();
}
public void do_update()
{
internationalparser.parse();//this is the function to parse RSS feeds
}
public void populate_listview()
{
ArrayList<HashMap<String, String>> newsList = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_HEAD);
// looping through all song nodes <song>
NodeList itemLst = doc.getElementsByTagName("item");
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
//map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
newsList.add(map);
}
list=(ListView)findViewById(R.id.list);
// Getting adapter by passing xml data ArrayList
adapter=new InternationalAdapter(this, newsList);
list.setAdapter(adapter);
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent myintent = new Intent("com.abcd.rssreaderinternationalpodcast.PODCAST");
Bundle mybundle = new Bundle();
mybundle.putInt("number", position);
myintent.putExtras(mybundle);
startActivity(myintent);
}
});
}
private class DoInBackground extends AsyncTask<Void, Void, Void>
implements DialogInterface.OnCancelListener
{
private ProgressDialog dialog;
private Intent intent;
private Intent intent2;
public void onPreExecute()
{
dialog = ProgressDialog.show(International.this, "", "Loading", true);
}
protected Void doInBackground(Void... unused)
{
do_update();
return null;
}
public void retry()
{
internationalparser.parse();
}
protected void onPostExecute(Void unused)
{
if(International.Title!=null)
{
dialog.dismiss();
populate_listview();
}
if(International.Title==null) ///this is what I tried.
{
dialog.dismiss();
AlertDialog.Builder alertbox = new AlertDialog.Builder(International.this);
alertbox.setMessage("Error in connection!");
alertbox.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
retry(); //here i want to reload activity
}
});
alertbox.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
finish();
}
});
alertbox.show();
}
}
public void onCancel(DialogInterface dialog)
{
cancel(true);
dialog.dismiss();
}
}
}
答案 0 :(得分:2)
这是我的互联网连接类,带有重试/退出
用法:
URLContent httpContent = new URLContent(this);
String test = httpContent.getContent("http://www.hotmail.com/");
类:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class URLContent {
MainActivity mMainActivity;
String returnData;
String address;
public URLContent(MainActivity mMainActivity)
{
this.mMainActivity = mMainActivity;
}
public String getContent(String address)
{
this.address = address;
processContent(address);
return returnData;
}
private void processContent(String address)
{
try {
if (!isNetworkAvailable(mMainActivity))
{
throw new Exception("No internet connectivity.");
}
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(address));
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() == 200)
{
InputStream ips = response.getEntity().getContent();
BufferedReader buf = new BufferedReader(new InputStreamReader(ips,"UTF-8"));
StringBuilder sb = new StringBuilder();
String s;
while(true)
{
s = buf.readLine();
if(s==null || s.length()==0)
break;
sb.append(s);
}
buf.close();
ips.close();
returnData = sb.toString();
}
else
{
throw new Exception();
}
} catch (Exception e) {
makeAndShowDialogBox(e.getMessage()).show();
}
}
private static boolean isNetworkAvailable(Context context)
{
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null)
{
return false;
} else
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
{
for (int i = 0; i < info.length; i++)
{
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
}
}
return false;
}
private AlertDialog makeAndShowDialogBox(String msg)
{
AlertDialog myQuittingDialogBox = new AlertDialog.Builder(mMainActivity)
.setCancelable(false)
.setTitle(R.string.connectionerr)
.setMessage(msg)
.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//whatever should be done when answering "YES" goes here
getContent(address);
}
})//setPositiveButton
.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//whatever should be done when answering "NO" goes here
mMainActivity.finish();
}
})//setNegativeButton
.create();
return myQuittingDialogBox;
}
}
答案 1 :(得分:1)
public static boolean isNetworkAvailable(Context context) {
isNetworkAvailable = false;
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
return false;
} else {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
isNetworkAvailable = true;
return true;
}
}
}
}
return false;
}//isNetworkAvailable()
如果没有互联网连接,请使用上述方法检查互联网连接并引发警报对话框。
private AlertDialog makeAndShowDialogBox(){
AlertDialog myQuittingDialogBox =
new AlertDialog.Builder(this)
//set message, title, and icon
.setTitle("Terminator")
.setMessage("Are you sure that you want to quit?")
.setIcon(R.drawable.ic_menu_end_conversation)
.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//whatever should be done when answering "YES" goes here
}
})//setPositiveButton
.setNegativeButton("NO", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//whatever should be done when answering "NO" goes here
}
})//setNegativeButton
.create();
return myQuittingDialogBox;
}
更新::
new DoInBackground().execute();
如下所示替换此行并尝试
if(isNetworkAvailable(YourActivity.this))
new DoInBackground().execute();
else{
makeAndShowDialogBox();
}