Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NetworkOnMainThread从输入流检索文件并将其作为PDF打开时出现异常_Android_Android Asynctask - Fatal编程技术网

Android NetworkOnMainThread从输入流检索文件并将其作为PDF打开时出现异常

Android NetworkOnMainThread从输入流检索文件并将其作为PDF打开时出现异常,android,android-asynctask,Android,Android Asynctask,下面是基本上是OWRK的代码…大部分是。它适用于我测试的所有手机,但在客户端手机上失败,我无法使用。此代码的哪部分可能导致NetworkOnMainThreadException 这很直接。我在onPostExecute()中所做的是: 从onBackground()获取InputStream 如果InputStream为null,则中止;如果为null,则中止 正在检查外部存储可用性,如果不可用,则中止 从InputStream创建文件 正在检查PDF查看器是否可用,如果不可用则中止 打开新创

下面是基本上是OWRK的代码…大部分是。它适用于我测试的所有手机,但在客户端手机上失败,我无法使用。此代码的哪部分可能导致NetworkOnMainThreadException

这很直接。我在onPostExecute()中所做的是:

  • 从onBackground()获取InputStream
  • 如果InputStream为null,则中止;如果为null,则中止
  • 正在检查外部存储可用性,如果不可用,则中止
  • 从InputStream创建文件
  • 正在检查PDF查看器是否可用,如果不可用则中止
  • 打开新创建的PDF

    @Override
    protected void onPostExecute(InputStream is) {
        super.onPostExecute(is);
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    
        if (is== null) {
            errorMessage = getString(R.string.error_server_communication);
            CustomDialogs.showErrorDialog( fragment.getActivity(), getString( R.string.error_title ), errorMessage );
            return;
        }
    
        //checking external storage avalibility
        if (!Tools.isWriteableExternalStorageAvalible()) {
            errorMessage = getString(R.string.error_no_external_storage);
            CustomDialogs.showErrorDialog( fragment.getActivity(), getString( R.string.error_title ), errorMessage );
            return;
        }               
    
        // opening pdf
        try {
            File directory = new File(Environment.getExternalStorageDirectory(), "MyApp");
            if (!directory.exists())
                directory.mkdirs();
    
            File file = new File(directory, "file.pdf");
    
            //usuwa poprzednio przechowywany wynik jesli taki byl
            if (file.exists()) 
                file.delete();
    
            file.createNewFile();                   
    
            // write the inputStream to a FileOutputStream
            OutputStream out = new FileOutputStream(file);
            out.write(IOUtils.toByteArray(is));
    
            is.close();
            out.flush();
            out.close();
    
            if (Tools.canDisplayPdf(fragment.getActivity())) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.fromFile(file), "application/pdf");
                startActivity( intent );
            } else {
                //user nie ma przegladarki pdf - komunikat
                errorMessage = getString(R.string.error_server_communication);
                CustomDialogs.showErrorDialog( fragment.getActivity(), getString( R.string.error_title ), errorMessage );
            }
    
        } catch (IOException e) {
            errorMessage = getString(R.string.error_server_communication);
            CustomDialogs.showErrorDialog( fragment.getActivity(), getString( R.string.error_title ), errorMessage );
        }
    }
    
  • 还包括堆栈跟踪。还有一个线索。客户端正在使用SSL检索InputStream,而我没有。不幸的是,我们还不能用SSL调试它

    12-05 21:34:02.648: E/AndroidRuntime(711): FATAL EXCEPTION: main
    12-05 21:34:02.648: E/AndroidRuntime(711): android.os.NetworkOnMainThreadException
    12-05 21:34:02.648: E/AndroidRuntime(711):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:668)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:174)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:188)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:178)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1383)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.commons.io.IOUtils.copy(IOUtils.java:1357)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:361)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at pl.luxmed.pp.activities.MedicalExaminationsActivity$OpenPdfAsyncTask.onPostExecute(MedicalExaminationsActivity.java:270)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at pl.luxmed.pp.activities.MedicalExaminationsActivity$OpenPdfAsyncTask.onPostExecute(MedicalExaminationsActivity.java:1)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at android.os.AsyncTask.finish(AsyncTask.java:631)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at android.os.Handler.dispatchMessage(Handler.java:99)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at android.os.Looper.loop(Looper.java:137)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at android.app.ActivityThread.main(ActivityThread.java:4745)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at java.lang.reflect.Method.invokeNative(Native Method)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at java.lang.reflect.Method.invoke(Method.java:511)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    12-05 21:34:02.648: E/AndroidRuntime(711):  at dalvik.system.NativeStart.main(Native Method)
    

    虽然您使用的是
    AsyncTask
    ,但它的
    onPostExecute()
    方法是在UI线程上执行的(以便更新视图等)。实际上,在单独的线程中执行的
    AsyncTask
    的唯一方法是
    doInBackground()
    ,因此您必须仅使用此方法执行所有涉及I/O(磁盘、网络)的操作,否则会出现异常


    有关详细信息,请参阅。

    尽管您使用的是
    AsyncTask
    ,但它的
    onPostExecute()
    方法是在UI线程上执行的(用于更新视图等)。实际上,在单独的线程中执行的
    AsyncTask
    的唯一方法是
    doInBackground()
    ,因此您必须仅使用此方法执行所有涉及I/O(磁盘、网络)的操作,否则会出现异常


    有关详细信息,请参阅。

    来自Android文档的Android.os.NetworkMainThreadException明确指出,从
    Android 2.3.3
    中,您不能在主UI线程中调用URL。请反复检查,确保您没有犯此错误

    来自Android开发者


    当应用程序尝试在其主线程上执行网络操作时引发的异常。这仅针对针对蜂巢SDK或High的应用程序引发。

    来自Android DocAndroid.os.NetworkOnMainThreadException明确指出,来自
    Android 2.3.3
    的应用程序不能调用URL主UI线程。请反复检查,确保您没有犯此错误

    来自Android开发者


    当应用程序尝试在其主线程上执行网络操作时引发的异常。这仅针对针对蜂巢SDK或High的应用程序引发。

    MedicalCaminationsActivity.java的第270行有什么内容?它是out.write(IOUtils.toByteArray(is));我们有赢家吗?:)我认为是这样。检查该语句的任何部分是否需要网络连接,我认为您已经解决了问题。MedicalCaminationsActivity.java的第270行有什么内容?没有了。write(IOUtils.toByteArray(is));我们有赢家吗?:)我认为是这样。检查一下这句话的任何部分是否需要网络连接,我想你已经解决了你的问题。奇怪的是,它在大多数手机上都能正常工作。请看我的分步列表。你能告诉我哪些步骤应该转到onBackground()?@Xylian-MedicalCaminationSactivity.java的第270行是什么吗?@Xylian据我所知,在某个时候,你会得到你的PDF文件的URI。因此,请执行所有需要的文件操作,以在
    doInBackground()
    中获取它,并从中返回URI,然后尝试在
    onPostExecute()
    中查看它(检查查看器是否可用,启动意图,通知用户等)。@Xylian和yes,NetworkOnMainThreadException是在2.3.3中引入的,正如编码器在回答中提到的,修改了我的代码,所以onBackground()将URL传递到该文件,它保存了大部分操作。唯一的开场白现在是onPostExecute——等待客户的反馈,但我希望它进展顺利,因为它在大多数手机上都能正常工作。请看我的分步列表。你能告诉我哪些步骤应该转到onBackground()?@Xylian-MedicalCaminationSactivity.java的第270行是什么吗?@Xylian据我所知,在某个时候,你会得到你的PDF文件的URI。因此,请执行所有需要的文件操作,以在
    doInBackground()
    中获取它,并从中返回URI,然后尝试在
    onPostExecute()
    中查看它(检查查看器是否可用,启动意图,通知用户等)。@Xylian和yes,NetworkOnMainThreadException是在2.3.3中引入的,正如编码器在回答中提到的,修改了我的代码,所以onBackground()将URL传递到该文件,它保存了大部分操作。现在只有onPostExecute主持了开幕式——等待客户的反馈,但我希望一切顺利