我有四个班级:
MainActivity extends AppCompactActivity
MainAsyncTask extends AsyncTask<String, String, List>
Intermediate
扩展了MainAsyncTask并具有两个功能。 (FuncA,FuncB)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) {
}
}
这样做的目的是在一个FuncA
类的类中添加FuncB
和AsyncTask
以及Leaf
方法。
答案 0 :(得分:0)
如果没有堆栈跟踪,我会说:
启动Leaf
课程会导致HTM
变量启动。
通过调用HTM
方法启动FunA
变量。
FunA
方法运行网络访问代码,而不是在DoInBackground
内运行(因此在主线程上运行)。
如果您不希望获得DoInBackground
例外,您的网络代码只能在NetworkOnMainThread
内投放。
在您启动AsyncTask
之前会抛出异常,因为创建它会导致FunA
代码运行。
在DoInBackground
内移动此行,使其在执行AsyncTask
时运行,而不是在创建时运行。
Document HTM = FunA();
另外,您的类层次结构非常复杂。您不需要Intermediate或Leaf类。所有代码都可以轻松移动到MainAsync
类,因此更容易理解。