android - AsyncTask 卡住了
问题描述
我得到了一个AsyncTask
应该从一个URL
到一个斯特林的信息。
主要活动:
package e.marco.myapplication;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;
public class MainActivity extends AppCompatActivity {
public String check;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new statistik().execute();
}
public class statistik extends AsyncTask<String, Void, String[]> {
@Override
protected String[] doInBackground(String... strings) {
Log.d("test", "test1");
check = "";
try {
check = new URLconnection("www.myurl.com").execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
;
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("test", "test2");
Log.d("test", check);
String statistik[] = check.split("\n",-1);
Log.d("test", Arrays.toString(statistik));
return statistik;
}
}
}
如果我在 Logcat 中运行我的项目,我只会看到Log.d ("teset", "test1")
输出,仅此而已。我认为它卡在了 try...
URLconnection
类正在工作,所以这没有问题如果我把这段代码放在AsyncTask
里面并将它写在onCreate
类中它工作正常。那么为什么它会卡在课堂上AsyncTask
而onCreate
不是课堂上呢?
编辑:我在 onCreate 类中调用任务,如下所示:
new statistik().execute();
网址连接类:
public class URLconnection extends AsyncTask<String, Void, String> {
String urlll;
public URLconnection(String urltext) {
super();
urlll = urltext;
}
private String readStream(InputStream is) {
try {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int i = is.read();
while (i != -1) {
bo.write(i);
i = is.read();
}
return bo.toString();
} catch (IOException e) {
return "";
}
}
@Override
protected String doInBackground(String... strings) {
String test = "Error";
URL url = null;
try {
url = new URL(urlll);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
test = readStream(in);
} finally {
urlConnection.disconnect();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return test;
}
}
Android 9 / API 28 下的 Logcat 调试:
2019-03-15 10:06:12.794 20358-20358/? I/arco.swimcommi: Not late-enabling -Xcheck:jni (already on)
2019-03-15 10:06:12.814 20358-20358/? W/arco.swimcommi: Unexpected CPU variant for X86 using defaults: x86
2019-03-15 10:06:12.928 20358-20358/e.marco.swimcommit W/ActivityThread: Application e.marco.swimcommit is waiting for the debugger on port 8100...
2019-03-15 10:06:12.929 20358-20358/e.marco.swimcommit I/System.out: Sending WAIT chunk
2019-03-15 10:06:13.932 20358-20358/e.marco.swimcommit I/System.out: Debugger has connected
2019-03-15 10:06:13.932 20358-20358/e.marco.swimcommit I/System.out: waiting for debugger to settle...
2019-03-15 10:06:14.133 20358-20358/e.marco.swimcommit I/chatty: uid=10090(e.marco.swimcommit) identical 1 line
2019-03-15 10:06:14.334 20358-20358/e.marco.swimcommit I/System.out: waiting for debugger to settle...
2019-03-15 10:06:14.535 20358-20358/e.marco.swimcommit I/System.out: waiting for debugger to settle...
2019-03-15 10:06:14.939 20358-20358/e.marco.swimcommit I/chatty: uid=10090(e.marco.swimcommit) identical 2 lines
2019-03-15 10:06:15.140 20358-20358/e.marco.swimcommit I/System.out: waiting for debugger to settle...
2019-03-15 10:06:15.342 20358-20358/e.marco.swimcommit I/System.out: debugger has settled (1472)
2019-03-15 10:06:15.595 20358-20358/e.marco.swimcommit W/arco.swimcommi: JIT profile information will not be recorded: profile file does not exits.
2019-03-15 10:06:15.607 20358-20358/e.marco.swimcommit I/chatty: uid=10090(e.marco.swimcommit) identical 10 lines
2019-03-15 10:06:15.608 20358-20358/e.marco.swimcommit W/arco.swimcommi: JIT profile information will not be recorded: profile file does not exits.
2019-03-15 10:06:15.632 20358-20358/e.marco.swimcommit I/InstantRun: starting instant run server: is main process
2019-03-15 10:06:15.859 20358-20358/e.marco.swimcommit W/arco.swimcommi: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
2019-03-15 10:06:15.859 20358-20358/e.marco.swimcommit W/arco.swimcommi: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
2019-03-15 10:06:16.234 20358-20388/e.marco.swimcommit D/NetworkSecurityConfig: No Network Security Config specified, using platform default
2019-03-15 10:06:16.477 20358-20358/e.marco.swimcommit D/OpenGLRenderer: Skia GL Pipeline
2019-03-15 10:06:16.662 20358-20393/e.marco.swimcommit I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
2019-03-15 10:06:16.662 20358-20393/e.marco.swimcommit I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
2019-03-15 10:06:16.662 20358-20393/e.marco.swimcommit I/OpenGLRenderer: Initialized EGL, version 1.4
2019-03-15 10:06:16.662 20358-20393/e.marco.swimcommit D/OpenGLRenderer: Swap behavior 1
2019-03-15 10:06:16.663 20358-20393/e.marco.swimcommit W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
2019-03-15 10:06:16.663 20358-20393/e.marco.swimcommit D/OpenGLRenderer: Swap behavior 0
2019-03-15 10:06:16.675 20358-20393/e.marco.swimcommit D/EGL_emulation: eglCreateContext: 0xedac0d40: maj 3 min 0 rcv 3
2019-03-15 10:06:16.701 20358-20393/e.marco.swimcommit D/EGL_emulation: eglMakeCurrent: 0xedac0d40: ver 3 0 (tinfo 0xe63d00d0)
2019-03-15 10:06:16.780 20358-20358/e.marco.swimcommit W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@df988d6
2019-03-15 10:06:16.880 20358-20358/e.marco.swimcommit W/arco.swimcommi: Accessing hidden method Landroid/graphics/FontFamily;-><init>()V (light greylist, reflection)
2019-03-15 10:06:16.880 20358-20358/e.marco.swimcommit W/arco.swimcommi: Accessing hidden method Landroid/graphics/FontFamily;->addFontFromAssetManager(Landroid/content/res/AssetManager;Ljava/lang/String;IZIII[Landroid/graphics/fonts/FontVariationAxis;)Z (light greylist, reflection)
2019-03-15 10:06:16.880 20358-20358/e.marco.swimcommit W/arco.swimcommi: Accessing hidden method Landroid/graphics/FontFamily;->addFontFromBuffer(Ljava/nio/ByteBuffer;I[Landroid/graphics/fonts/FontVariationAxis;II)Z (light greylist, reflection)
2019-03-15 10:06:16.880 20358-20358/e.marco.swimcommit W/arco.swimcommi: Accessing hidden method Landroid/graphics/FontFamily;->freeze()Z (light greylist, reflection)
2019-03-15 10:06:16.880 20358-20358/e.marco.swimcommit W/arco.swimcommi: Accessing hidden method Landroid/graphics/FontFamily;->abortCreation()V (light greylist, reflection)
2019-03-15 10:06:16.880 20358-20358/e.marco.swimcommit W/arco.swimcommi: Accessing hidden method Landroid/graphics/Typeface;->createFromFamiliesWithDefault([Landroid/graphics/FontFamily;Ljava/lang/String;II)Landroid/graphics/Typeface; (light greylist, reflection)
2019-03-15 10:06:17.163 20358-20358/e.marco.swimcommit I/Choreographer: Skipped 35 frames! The application may be doing too much work on its main thread.
2019-03-15 10:06:17.206 20358-20393/e.marco.swimcommit D/EGL_emulation: eglMakeCurrent: 0xedac0d40: ver 3 0 (tinfo 0xe63d00d0)
2019-03-15 10:06:17.468 20358-20393/e.marco.swimcommit D/EGL_emulation: eglMakeCurrent: 0xedac0d40: ver 3 0 (tinfo 0xe63d00d0)
2019-03-15 10:06:17.545 20358-20393/e.marco.swimcommit D/EGL_emulation: eglMakeCurrent: 0xedac0d40: ver 3 0 (tinfo 0xe63d00d0)
2019-03-15 10:06:17.649 20358-20393/e.marco.swimcommit D/EGL_emulation: eglMakeCurrent: 0xedac0d40: ver 3 0 (tinfo 0xe63d00d0)
2019-03-15 10:06:17.708 20358-20393/e.marco.swimcommit I/chatty: uid=10090(e.marco.swimcommit) RenderThread identical 1 line
2019-03-15 10:06:17.769 20358-20393/e.marco.swimcommit D/EGL_emulation: eglMakeCurrent: 0xedac0d40: ver 3 0 (tinfo 0xe63d00d0)
2019-03-15 10:06:18.774 20358-20393/e.marco.swimcommit D/EGL_emulation: eglMakeCurrent: 0xedac0d40: ver 3 0 (tinfo 0xe63d00d0)
2019-03-15 10:06:20.307 20358-20396/e.marco.swimcommit D/test: test1
解决方案
根据文档,您必须在 UI 线程上启动 AsyncTask。如果您想尝试在第一个任务中启动第二个任务,您可以这样做:
mainActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
...
check = new URLconnection("www.myurl.com").execute().get();
...
}
}
这不是一个干净的方式。我建议重写您的代码并在第一个任务中添加所有阻塞方法。
推荐阅读
- python - 如何恢复扭曲的图像
- reactjs - 如何将用户输入数据存储在控制台登录表单中从子组件提交到父组件?
- laravel - 如何访问与 whereHas 中的数据透视表相关的表?
- android - android 意图数据使用 if(!bundle.getString("ACCOUNT").equals(null) ) 但错误
- select - SPARQL 根据主题内容进行选择
- android - 如何检测电源按钮事件android应用程序
- vhdl - 将信号分配给自身失败
- hl7-fhir - What's the difference between id and identifier for a FHIR resource?
- python-3.x - 如何从图像中提取复杂区域
- amcharts - 使用 Amchart v4 的嵌套饼图中的框可以有不同的颜色吗?