【问题标题】:android.os.NetworkOnMainThreadExceptionandroid.os.NetworkOnMainThreadException
【发布时间】:2013-04-24 00:13:05
【问题描述】:

为什么当我在 Android 4.0 版本中运行时,这个错误通常出现在 listview 中,有人可以帮我解决这个问题。我搜索了一些网站,比如在 url 中使用 asynctask 我该如何实现它。

我尝试过的: 这是异步任务

public class GetTask extends AsyncTask<String, Void, Integer> {
    private ProgressDialog progressDialog;
    public GetTask(){
    }
    protected void onPreExecute() {
                   this.progressDialog=new ProgressDialog(FirstActivity.this);
        this.progressDialog.show();
    }
    @Override
    protected Integer doInBackground(String... userurl) {
                         page_count=0;
                         Callpagedetails();
        return null;
    }

    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        if (progressDialog.isShowing())
            progressDialog.dismiss();
          listview = (ListView) findViewById(R.id.listquestion);
         listview.setAdapter(adapterf);
    }
}

使用代码我收到“空指针异常”。这是我在 4.0 版本中尝试上述代码时的日志

04-30 07:25:04.842: E/AndroidRuntime(1654): FATAL EXCEPTION: AsyncTask #1
04-30 07:25:04.842: E/AndroidRuntime(1654): java.lang.RuntimeException: An error occured while executing doInBackground()
04-30 07:25:04.842: E/AndroidRuntime(1654):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at java.lang.Thread.run(Thread.java:856)
04-30 07:25:04.842: E/AndroidRuntime(1654): Caused by: java.lang.NullPointerException
04-30 07:25:04.842: E/AndroidRuntime(1654):     at com.example.know.FirstActivity.Callpagedetails(FirstActivity.java:227)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at com.example.know.FirstActivity$GetTask.doInBackground(FirstActivity.java:125)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at com.example.know.FirstActivity$GetTask.doInBackground(FirstActivity.java:1)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-30 07:25:04.842: E/AndroidRuntime(1654):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-30 07:25:04.842: E/AndroidRuntime(1654):     ... 4 more

    04-30 06:49:34.781: E/WindowManager(851): Activity com.example.know.FirstActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{40cd41e8 V.E..... R.....ID 0,0-191,168} that was originally added here
    04-30 06:49:34.781: E/WindowManager(851): android.view.WindowLeaked: Activity com.example.know.FirstActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{40cd41e8 V.E..... R.....ID 0,0-191,168} that was originally added here
    04-30 06:49:34.781: E/WindowManager(851):   at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354)
    04-30 06:49:34.781: E/WindowManager(851):   at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
    04-30 06:49:34.781: E/WindowManager(851):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.Dialog.show(Dialog.java:281)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.ProgressDialog.show(ProgressDialog.java:116)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.ProgressDialog.show(ProgressDialog.java:99)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.ProgressDialog.show(ProgressDialog.java:94)
    04-30 06:49:34.781: E/WindowManager(851):   at com.example.know.FirstActivity$GetTask.<init>(FirstActivity.java:99)
    04-30 06:49:34.781: E/WindowManager(851):   at com.example.know.FirstActivity.onCreate(FirstActivity.java:88)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.Activity.performCreate(Activity.java:5104)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.ActivityThread.access$600(ActivityThread.java:141)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
    04-30 06:49:34.781: E/WindowManager(851):   at android.os.Handler.dispatchMessage(Handler.java:99)
    04-30 06:49:34.781: E/WindowManager(851):   at android.os.Looper.loop(Looper.java:137)
    04-30 06:49:34.781: E/WindowManager(851):   at android.app.ActivityThread.main(ActivityThread.java:5041)
    04-30 06:49:34.781: E/WindowManager(851):   at java.lang.reflect.Method.invokeNative(Native Method)
    04-30 06:49:34.781: E/WindowManager(851):   at java.lang.reflect.Method.invoke(Method.java:511)
    04-30 06:49:34.781: E/WindowManager(851):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    04-30 06:49:34.781: E/WindowManager(851):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    04-30 06:49:34.781: E/WindowManager(851):   at dalvik.system.NativeStart.main(Native Method)

有人可以帮我解决这个问题吗@Thanks

【问题讨论】:

  • 这意味着你在主线程而不是你的 aync 类上做一些互联网进程。所以确认主线程中是否有任何代码需要互联网。如果是这样,那么 android 4.0 将给出异常。
  • Callpagedetails(); 做了什么。?它在做任何与网络相关的任务吗?
  • @AnujMathur_07 是 Callpagedetails();是的,我在这里得到了列表视图
  • 发布 Callpagedetails() 方法..
  • 你在那里得到一个NullPointerException,结果是window leaking error。请检查,必须正确初始化ListView

标签: android android-asynctask


【解决方案1】:

从下面的代码中删除此方法Callpagedetails();,因为您已经在AsyncTask 中执行此操作。无需在AsyncTask 中再次使用Thread

runOnUiThread(new Runnable() {
                 public void run() {

                             page_count=0;
                            Callpagedetails();//here i call the url

                 }

只需使用:

protected Integer doInBackground(String... userurl) {
            // TODO Auto-generated method stub      
                             page_count=0;
                            Callpagedetails(); //here i call the url

                 }

【讨论】:

  • 现在您收到“Activity com.example.know.FirstActivity has leaked window”错误意味着您正在尝试更改 Activity 中的某些值或在 Process complate 之前显示对话框。
  • 如果您尝试在布局中设置值,请在 onPostExecute 方法中进行,而不是在 Callpagedetails() 中;
  • 我使用了 listview.setAdapter(adapterf);在 postExecute 方法中,但仍然出现错误!
  • 使用上面的代码我得到了上面的错误我怎么能把它弄好
  • 我也添加了 callpagedetails 部分
【解决方案2】:

当应用程序尝试在其主线程上执行网络或线程操作时抛出此异常,即在 Activity 的 onCreate() 方法中 - 有两种解决方案 -

1) 不要在主 UI 线程中做与网络相关的工作,为此使用异步任务。

2) 在 setContentView(R.layout.main); 之后将以下代码写入 MainActivity 文件中;

 if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

【讨论】:

  • 我不需要这种可以避免问题的建议
  • 那你应该去 AsyncTask
【解决方案3】:

下面代码块中的当前问题

public GetTask(){
        progressDialog = ProgressDialog.show(FirstActivity.this, "Loading","Please Wait");
    }

    protected void onPreExecute() {
        this.progressDialog.setMessage("Progress start");
        this.progressDialog.show();
    }

发生的情况是,当 GetTask() 被调用时,将显示一个进度对话框,在构造函数调用后 onPreExecute() 将被调用,并且此方法再次尝试显示相同的对话框。

你只需要将你的方法修改为..

public GetTask(){
            //progressDialog = ProgressDialog.show(FirstActivity.this, "Loading","Please Wait");
        }

        protected void onPreExecute() {
            this.progressDialog = new ProgressDialog(yourContext);
            this.progressDialog.setTitle("Loading");
            this.progressDialog.setMessage("Progress start");
            this.progressDialog.show();
        }

编码愉快 :)

【讨论】:

  • 第 227 行是什么...检查是否为空
  • @Pankaj Kumar 我在第 227 行使用了 loadmorelist
  • 我们正在询问 callpagedetails() 的完整代码,但您发布了一些部分...检查 loadmorelist 是否有任何怀疑可能为 null 将 null 检查放在那里...如果您正在更新还有一件事您在 callpagedetails() 中的 llistview,不要那样做...将代码移到 AsyncTask 的 onPostExecute 中..
  • 为什么我在没有检测到 GPU 仿真的情况下得到这个语句。
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多