2016-08-18 64 views
-1

我有四類:如果Android中有多個類,應該在哪裏實現AsyncTask類的方法?

  1. MainActivity extends AppCompactActivity
  2. MainAsyncTask extends AsyncTask<String, String, List>
  3. Intermediate延伸MainAsyncTask和具有雙重功能。 (FuncA,FuncB)
  4. Leaf extends Intermediate和實施doInBackground()onPostExecute()

當我運行該應用程序會提示:

無法實例活動ComponentInfo {}:android.os.NetworkonMainThreadException。

我該如何擺脫錯誤。據我瞭解,doInBackground()onPostExecute()應該在MainAsyncTask類中實現嗎?

類是: MianActivity.java

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 

public class MainActivity extends AppCompatActivity { 
    Leaf object = new Leaf(); 

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

     Button fab = (Button) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       object.execute(); 
      } 
     }); 
    } 
} 

MainAsyncTask.java

import android.os.AsyncTask; 


public class MainAsync extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 

    } 


    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected void onProgressUpdate(String... text) { 


    } 
} 

Intermediate.java

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

import java.io.IOException; 

public class Intermediate extends MainAsync{ 

    public Document FunA(){ 
     System.out.println("Printed FunA()"); 
     String url = "http://blogs.tribune.com.pk/story/37034/zakir-naik-has-a-large-following-in-pakistan-should-we-be-alarmed/"; 
      Document doc = null; 
      try { 
       doc = Jsoup.connect(url).timeout(10 * 1000).get(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
     } 
     return doc; 
    } 

    public void FunB(){ System.out.println("Printed FunB()");} 
} 
    } 

Leaf.java

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

public class Leaf extends Intermediate{ 

     Document HTM = FunA(); 

     public void FunC() { 
      String heading = ""; 
      System.out.println("Printed FunC()"); 
      Elements seep = HTM.select("h1"); 
      for (Element foo : seep) { 
       heading = foo.text(); 
       System.out.println(heading); 
       break; 
      } 

     } 

     public void FunD() { 
      System.out.println("Printed FunD()"); 
     } 

     public void FunE() { 
      System.out.println("Printed FunE()"); 

     } 
     @Override 
     protected String doInBackground(String... params) { 
      FunB();FunC();FunD();FunE(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

     } 


     @Override 
     protected void onPreExecute() { 

     } 

     @Override 
     protected void onProgressUpdate(String... text) { 


     } 
    } 

這樣做的目的是在Leaf類中的一個類中添加​​和FuncB以及AsyncTask方法。

+1

錯誤是說你正在嘗試在主線程上運行網絡操作。您沒有發佈代碼,因此無法確定您的錯誤所在。 – Kuffs

+0

@Kuffs更新。 – waqas

+0

由於沒有網絡操作,您的發佈代碼拋出此異常是不可能的。 – Kuffs

回答

0

在沒有堆棧跟蹤我會說:

啓動您的Leaf類導致的啓動方式HTM變量。通過調用FunA方法來啓動HTM變量。

FunA方法運行網絡訪問代碼,並沒有運行在DoInBackground(因此在主線程上運行)。

您的網絡代碼只能在DoInBackground之內運行,如果您不希望發生NetworkOnMainThread異常。

甚至在啓動AsyncTask之前拋出異常,因爲只是創建它會導致代碼運行FunA

DoInBackground的內部移動此行,以便在執行AsyncTask時運行,而不是在創建時運行。

Document HTM = FunA(); 

在單獨的筆記中,您的類層次結構非常複雜。你不需要Intermediate或Leaf類。所有的代碼可以很容易地移動到MainAsync類,因此會更容易理解。

+0

它現在正在工作..感謝哥們。 – waqas

相關問題