2014-01-10 29 views
3

我下面零散的AsyncTask的WebView導致問題

http://examples.javacodegeeks.com/android/core/os/asynctask/android-asynctask-example/

得到一個想法,如何使用的AsyncTask我的項目,一切順利的話,而且幾乎沒有只有一個小問題; Android的最佳做法是使用碎片來處理所有的GUI ...

上次我嘗試使用碎片並沒有那麼困難,所以我認爲我可以直接跳到它並遵循教程最好的我可以...

長話短說,程序崩潰每次我打的按鈕加載的WebView

這裏的時間是我的片段:

package com.wausoft.app; 

import android.app.Fragment; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebView; 
import android.widget.Button; 
import android.widget.Toast; 

import java.net.URL; 
import java.util.ArrayList; 

public class MainFragment extends Fragment { 

    protected ArrayList<Button> buttons = new ArrayList<Button>(); 

    protected View.OnClickListener listener = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      switch(view.getId()) { 
       case R.id.btn_dummy: 
        dummyFunc(view); 
        break; 
       case R.id.btn_load: 
        readWebpage(); 
        break; 
      } 
     } 
    }; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_main, container, false); 
     buttons.add((Button) view.findViewById(R.id.btn_load)); 
     buttons.add((Button) view.findViewById(R.id.btn_dummy)); 

     for(Button btn : buttons) btn.setOnClickListener(listener); 

     return view; 
    } 

    public void dummyFunc(View view) { 
     Toast.makeText(view.getContext(), "Button Clicked", Toast.LENGTH_SHORT).show(); 
    } 

    public void readWebpage() { 
     try { 
     URL url = new URL("http://www.example.com/"); 
     LoadWebpageAsync task = new LoadWebpageAsync(); 
     task.execute(url); 
     } catch(Exception e) { 
      Log.v("DEBUG: ", e.getMessage()); 
     } 
    } 

    private class LoadWebpageAsync extends AsyncTask<URL, Void, String> { 
     @Override 
     protected String doInBackground(URL... urls) { 
      try { 
      WebView webView = (WebView) getView().findViewById(R.id.web_view); 
      webView.getSettings().setJavaScriptEnabled(true); // program crashes here 
      webView.loadUrl(urls[0].toString()); 
      } catch (Exception e) { 
       Log.v("DEBUG: ", e.getMessage()); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
     } 
    } 
} 

並記錄在案;這是我得到的錯誤消息:

01-10 17:09:52.544 23959-24282/? V/DEBUG:﹕ java.lang.Throwable: A WebView method was called on thread 'AsyncTask #1'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {41e2e8d8} called on null, FYI main Looper is Looper (main, tid 1) {41e2e8d8}) 

那麼你們誰能告訴我如何解決這個問題?如果不擺脫的AsyncTask或者是片段的...

從我得到的回答,我結束這一找到一個更好的教程...謝謝你們!

+0

擺脫asynctask。 webview是一個視圖,爲什麼你想在後臺線程中。沒有意義 – Raghunandan

+0

@Raghunandan這整個點是使用AsyncTask,如果我擺脫它,它消除了程序的整個目的 –

+0

你所做的是錯誤的。你應該使用asynctask如果你正在做的事情不涉及像網絡操作一樣更新ui – Raghunandan

回答

2

您正在瀏覽webview的網址爲doInbackground。你應該在UI線程上做。

你會使用asynctask,而做一些網絡相關的操作,如從服務器獲取數據。

請動你的WebView代碼onCreateViewonActivityCreated

也沒有必要爲ArrayList<Button>。你只有2個按鈕

Button b1,b2; 
WebView wb; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_main, container, false); 
     b1= (Button) view.findViewById(R.id.btn_load); 
     b2=(Button) view.findViewById(R.id.btn_dummy); 

     b1.setOnClickListener(listener); 
     b2.setOnClickListener(listener); 

     wb= (WebView) view.findViewById(R.id.web_view); 
     wb.getSettings().setJavaScriptEnabled(true); 
     wb.loadUrl("http://www.example.com/"); 

     return view; 
    } 
+0

,但不會因爲等待webview完成加載而降低程序的響應速度? –

+0

我會假設webview加載是異步完成的。 –

+0

@ElectricCoffee不放棄,直到你正在做一些繁重的任務,需要在後臺線程上運行,這是不是在webview中加載url的情況下 – Raghunandan

0

視圖對象不能在後臺線程中加載,它們必須在UI線程中被訪問和修改。

WebVIEW是一個視圖對象。停止在AsyncTask的「doinBACKGROUND」線程中調用它

+0

我只是按照教程... –