сохранение веб-страниц в кэш webview в android



Я создаю приложение, которое будет загружать некоторые веб-страницы из интернета и сохранять их в кэше, когда пользователь нажимает на кнопку, и загружать их позже, когда интернет недоступен. когда я запускаю свой код, я получаю исключение нулевого указателя. Я добавил все необходимые разрешения в файл манифеста.



public class MainActivity extends Activity {

Context context;
ArrayList<String> fileNames = new ArrayList<String>();
ArrayList<String> urls = new ArrayList<String>();
ArrayList<String> paths = new ArrayList<String>();
ArrayList<File> files = new ArrayList<File>();
boolean internet;

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

Button saveSiteOne = (Button)findViewById(R.id.button1);
saveSiteOne.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {

urls.add("http://www.google.com");
urls.add("http://www.facebook.com");

for(int i=0;i<urls.size();i++){
fileNames.add("file"+i+".html");
}

//Loop to get paths of files
for(int i=0;i<urls.size();i++){
paths.add(getApplicationContext().getFilesDir() + "/" + fileNames.get(i));
}

//Loop to create list of files getting from stored paths
for(int i=0;i<urls.size();i++){
files.add(new File(paths.get(i)));
}

internet = isNetworkAvailable();

WebView webView = new WebView(context);
WebSettings webSettings = webView.getSettings();
webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
webView.getSettings().setAppCachePath( context.getCacheDir().getAbsolutePath() );
webView.getSettings().setAllowFileAccess( true );
webView.getSettings().setAppCacheEnabled( true );
webView.getSettings().setJavaScriptEnabled( true );
webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT ); // load online by default

new downloadContentOfPage().execute();


}
});
}


class downloadContentOfPage extends AsyncTask<String, Void, String> {

FileOutputStream fos;
String result = "";
ProgressDialog progressDialog;
int position;

@Override
protected void onPreExecute() {
super.onPreExecute();

progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
progressDialog.show();
Log.e( "pre execute","yes");

try {
fos = context.openFileOutput(fileNames.get(position), Context.MODE_PRIVATE);
}
catch (IOException e) {
e.printStackTrace();
}
}

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

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
//give your url of html page that you want to download first time.
HttpGet httpGet = new HttpGet(urls.get(position));
HttpResponse response = null;
try {
response = httpClient.execute(httpGet, localContext);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()
)
);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

String line = null;
try {
while ((line = reader.readLine()) != null){
result += line + "n";
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}


@Override
protected void onPostExecute(String res) {

try {
fos.write(res.getBytes());
fos.close();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Toast.makeText( context.getApplicationContext(),"saved", Toast.LENGTH_LONG).show();
if(progressDialog.isShowing()) {
progressDialog.dismiss();
}

}
}


Logcat



03-05 17:07:08.269: E/AndroidRuntime(14974): FATAL EXCEPTION: main
03-05 17:07:08.269: E/AndroidRuntime(14974): java.lang.NullPointerException
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.view.ViewConfiguration.get(ViewConfiguration.java:318)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.view.View.<init> (View.java:3254)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.view.View.<init>(View.java:3299)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.view.ViewGroup.<init>(ViewGroup.java:443)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:52)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.webkit.WebView.<init>(WebView.java:556)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.webkit.WebView.<init>(WebView.java:533)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.webkit.WebView.<init>(WebView.java:513)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.webkit.WebView.<init>(WebView.java:502)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.webkit.WebView.<init>(WebView.java:492)
03-05 17:07:08.269: E/AndroidRuntime(14974): at com.example.html.MainActivity$1.onClick(MainActivity.java:78)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.view.View.performClick(View.java:4222)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.view.View$PerformClick.run(View.java:17620)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.os.Handler.handleCallback(Handler.java:800)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.os.Handler.dispatchMessage(Handler.java:100)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.os.Looper.loop(Looper.java:194)
03-05 17:07:08.269: E/AndroidRuntime(14974): at android.app.ActivityThread.main(ActivityThread.java:5370)
03-05 17:07:08.269: E/AndroidRuntime(14974): at java.lang.reflect.Method.invokeNative(Native Method)
03-05 17:07:08.269: E/AndroidRuntime(14974): at java.lang.reflect.Method.invoke(Method.java:525)
565   1  

1 ответ:

Проблема здесь:

    WebView webView = new WebView(context);

И это будет здесь:

    webView.getSettings().setAppCachePath( context.getCacheDir().getAbsolutePath() );

А здесь:

    try {
        fos = context.openFileOutput(fileNames.get(position), Context.MODE_PRIVATE);
    }

А здесь:

  Toast.makeText(context, "saved", Toast.LENGTH_LONG).show();

Взгляните. Вы использовали переменную context, но никогда не инициализировали ее. Удалите это жизнеспособное и замените его MainActivity.этот.

Как показано ниже:

   WebView webView = new WebView(MainActivity.this);

А здесь:

    webView.getSettings().setAppCachePath( MainActivity.this.getCacheDir().getAbsolutePath() );

А здесь:

    try {
        fos = MainActivity.this.openFileOutput(fileNames.get(position), Context.MODE_PRIVATE);
    }

А здесь:

  Toast.makeText(MainActivity.this, "saved", Toast.LENGTH_LONG).show();

Comments

    Ничего не найдено.