- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个简单的类:
public class MainActivity extends Activity {
NetworkTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
[...]
task = new NetworkTask();
task.execute();
}
public void myClickHandler(View view) {
switch(view.getId()) {
case R.id.button1:
// Why this line crash?
task.connection("127.0.0.1");
break;
}
}
}
和
public class NetworkTask extends AsyncTask<String, Void, String> {
Socket sock;
volatile boolean running = true;
public int connection(String url){
try{
sock = new Socket(url, 4567)
}
catch (IOException ex){
Logger.getLogger(NetworkTask.class.getName()).log(Level.SEVERE, null, ex);
return -1;
}
}
public String doInBackground(String... strings) {
// If I do this, it works well
//connection(127.0.0.1);
while(running)
{
[...]
}
return null;
}
}
正如我在从 AsyncTask 方法外部调用连接方法时评论的那样,应用程序崩溃时更特别是 « sock = new Socket(...) » 行。但是当在 AsynTask 方法内部完成连接调用时,将创建套接字。我不明白为什么。
发生了什么事?
谢谢。
最佳答案
因为当你这样做的时候
task.connection("127.0.0.1");
您仍在主 (UI) 线程中工作 - 您没有正确使用 AsyncTask。相反,您像普通类一样使用它,因此,您会在新的 Android 版本上得到一个 NetworkOnMainThreadException
。
然而,当您从 doInBackground()
调用时,这意味着您通过 execute
启动了 AsyncTask,并且工作是在一个单独的线程中完成的,让一切正常运行。
请记住,如果您正在做非网络的事情,您仍然可以从外面打电话。但是,我建议让您的 AsyncTask 尽可能少地依赖于外部,因为 AsyncTasks 只运行一次。如果你想做更多的工作,你必须创建一个新的实例,这意味着如果你依赖 setter 方法或类似的方法,你必须确保你再次调用这些方法,这使得这个简单的类比需要的更复杂。
对于如何使用 AsyncTask 的一个好的、中肯的解释,this是一个很好的来源。当然还有 official documentation .
关于android - 如何从外部将方法调用到 AsyncTask 类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14791617/
我的代码遇到了很大的困难。我正在开发一个显示歌词和和弦的应用程序。我使用两个重叠的textview分隔了和弦和歌词。 我在这个项目中遇到的问题是音高改变功能。我尽我所能向我解释得更好: 和弦总数为12
我有一个游戏并使用 Tune 作为分析库。使用最新的 Unity (5.3.4f1) 并通过 Unity 获取 apk(无 eclipse/android studio)。 我的游戏在 Play 商店
我是一名优秀的程序员,十分优秀!