如果在Android中有多个类,应该在哪里实现AsyncTask类的方法?

时间:2016-08-18 09:37:13

标签: android android-asynctask

我有四个班级:

  1. MainActivity extends AppCompactActivity
  2. MainAsyncTask extends AsyncTask<String, String, List>
  3. Intermediate扩展了MainAsyncTask并具有两个功能。 (FuncA,FuncB)
  4. Leaf extends Intermediate以及doInBackground()onPostExecute()
  5. 的实施

    当我运行应用程序时,它会提示:

      

    无法实例化活动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) {
    
    
            }
        }
    

    这样做的目的是在一个FuncA类的类中添加FuncBAsyncTask以及Leaf方法。

1 个答案:

答案 0 :(得分:0)

如果没有堆栈跟踪,我会说:

启动Leaf课程会导致HTM变量启动。

通过调用HTM方法启动FunA变量。

FunA方法运行网络访问代码,而不是在DoInBackground内运行(因此在主线程上运行)。

如果您不希望获得DoInBackground例外,您的网络代码只能在NetworkOnMainThread内投放。

在您启动AsyncTask之前会抛出异常,因为创建它会导致FunA代码运行。

DoInBackground内移动此行,使其在执行AsyncTask时运行,而不是在创建时运行。

Document HTM = FunA();

另外,您的类层次结构非常复杂。您不需要Intermediate或Leaf类。所有代码都可以轻松移动到MainAsync类,因此更容易理解。