开发者

Android - app force closes when no Internet connection

开发者 https://www.devze.com 2023-03-23 21:41 出处:网络
package info.testing; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document;
package info.testing;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.widget.Toast;

public class SoupActivity extends Activity {

private static final String TAG = "SoupActivity";
private static final String DATA = null;
private String data = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if(savedInstanceState != null)
    {
        data = savedInstanceState.getString(DATA);
        showResults();
    }
    else
    {
        parsePage();
    }
}

protected void parsePage(){
    Document doc = null;
    try {
        doc = Jsoup.connect("http://www.mydata.html").get();
        Toast.makeText(this, R.string.success, Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        Toast.makeText(this, R.string.error, Toast.LENGTH_SHORT).show();
    }

    Elements rows = doc.select("tr[class]");

    data = "<table>" + rows.toString() + "</table>";
    showResults();
}

protected void showResults(){
    WebView web = (WebView)findViewById(R.id.web);
    web.loadData(data, "text/html", "utf-8");
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState){
    savedInstanceState.putString(DATA, data);
    super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
    if(savedInstanceState !开发者_开发知识库= null)
    {
        data = savedInstanceState.getString(DATA);
    }
    super.onRestoreInstanceState(savedInstanceState);
}
}

Flash/Flex developer here starting to get in to Android development, I must admit I am loving it so far, but obviously taking a long time to work out why things happen the way they do.

So the problem I have is that my app crashes without an Internet connection - The application (process.testing) has stopped unexpectedly. This only happens when there is no internet connection and works perfectly if there is one. The only part of my code that accesses the Internet is in a try catch block, can anyone see what I'm doing wrong or how I can handle the error when there is no Internet connection available?


You can use this function to see if a connection is available :

/**
* Check the network state
* @param context context of application
* @return true if the phone is connected
*/
public static boolean isConnected(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        return true;
    }
    return false;
}


When you have no internet connection, doc is probably null and you get NullPointerException because you don't check this case:

Document doc = null;
try {
    // connect throws an exception, doc still null
    doc = Jsoup.connect("http://www.mydata.html").get();
    Toast.makeText(this, R.string.success, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
    Toast.makeText(this, R.string.error, Toast.LENGTH_SHORT).show();
}

// dereferencing null (doc) throws NullPointerException
Elements rows = doc.select("tr[class]");
0

精彩评论

暂无评论...
验证码 换一张
取 消