【问题标题】:Async Task working sometimes and not working most of the times异步任务有时工作但大部分时间不工作
【发布时间】:2014-10-21 20:50:15
【问题描述】:

我正在学习移动应用程序开发当我实现 Async Task 时,当我除了 doInBackground 添​​加 onPostExecute 和 onPreExecute 时它根本不起作用,但它在一段时间后停止工作。实际上,我正在尝试从 EditText 单击保存按钮保存数据,并尝试使用加载按钮将其取回并在文本视图中查看。现在我还为此添加了一个进度条。它正在抛出空指针异常。

public class loadSomeStuff extends AsyncTask<String, Integer, String>{
        ProgressDialog dialog;

    protected void onPreExecute(String f) {
        dialog = new ProgressDialog(FileOperations.this);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMax(100);
        dialog.show();
        f="whatever";
    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        FileInputStream fis=null;
        String dataResult=null;

        for(int i=0;i<20;i++){
            publishProgress(5);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        dialog.dismiss();
        try {
            fis = openFileInput(FILENAME);
            byte[] dataArray = new byte[fis.available()];
            while(fis.read(dataArray) != -1){
                dataResult= new String(dataArray);

            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            try {
                fis.close();
                return dataResult;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return "no data to handle";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        dialog.incrementProgressBy(values[0]);
    }

    @Override
    protected void onPostExecute(String result) {
        viewResults.setText(result);
    }

}
}

这是我的日志:

08-28 00:34:42.718: W/EGL_emulation(1430): eglSurfaceAttrib not implemented
08-28 00:34:49.528: D/AndroidRuntime(1430): Shutting down VM
08-28 00:34:49.528: W/dalvikvm(1430): threadid=1: thread exiting with uncaught exception (group=0xada39ba8)
08-28 00:34:49.538: E/AndroidRuntime(1430): FATAL EXCEPTION: main
08-28 00:34:49.538: E/AndroidRuntime(1430): Process: com.tarragon.tmessenger, PID: 1430
08-28 00:34:49.538: E/AndroidRuntime(1430): java.lang.NullPointerException
08-28 00:34:49.538: E/AndroidRuntime(1430):     at com.tarragon.tmessenger.FileOperations$loadSomeStuff.onProgressUpdate(FileOperations.java:154)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at com.tarragon.tmessenger.FileOperations$loadSomeStuff.onProgressUpdate(FileOperations.java:1)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:648)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at android.os.Looper.loop(Looper.java:136)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at java.lang.reflect.Method.invokeNative(Native Method)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at java.lang.reflect.Method.invoke(Method.java:515)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-28 00:34:49.538: E/AndroidRuntime(1430):     at dalvik.system.NativeStart.main(Native Method)
08-28 00:34:51.598: W/dalvikvm(1430): threadid=12: thread exiting with uncaught exception (group=0xada39ba8)
08-28 00:34:51.598: I/Process(1430): Sending signal. PID: 1430 SIG: 9

【问题讨论】:

  • 确保您在 onProgressUpdate 方法中获得正确的值。
  • 只要确保您的 FILENAME 不为空即可。
  • Thread.sleep(100); 这将阻止Main Thread!!!
  • 而 laalto 解决了实际问题

标签: android android-asynctask


【解决方案1】:

只需从您的doInBackground 方法中删除dialog.dismiss(); 并将其写入onPostExecute 方法。您收到 Nullpointer 错误,因为您已经关闭了一个对话框,同时您正在尝试更新其进度。这就是为什么它无法获得对话框。

我已从doInBackground 中删除了dialog.dismiss(); 方法并将其保留在onPostExecute();

尝试如下:

 @Override
protected String doInBackground(String... params) {
    // TODO Auto-generated method stub
    FileInputStream fis=null;
    String dataResult=null;

    for(int i=0;i<20;i++){
        publishProgress(5);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
  ...........................................

    return "no data to handle";
}

@Override
protected void onProgressUpdate(Integer... values) {
    dialog.incrementProgressBy(values[0]);
}

@Override
protected void onPostExecute(String result) {
      dialog.dismiss();
    viewResults.setText(result);
}

}

【讨论】:

    【解决方案2】:

    这样写 Post 方法:

    @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                // Dismiss the progress dialog
                if (pDialog.isShowing())
                    pDialog.dismiss();
       }
    

    【讨论】:

      【解决方案3】:

      您的onPreExecute() 签名错误。它不应该有任何论据。因此,它不会覆盖方法并且不会被调用,因此您的 dialog 仍然为空。

      还要注意缺少的 @Override 注释 - 具有默认配置的 IDE 会自动将其添加到覆盖方法的方法中,而您的方法没有。

      从方法中删除 String f 参数。

      【讨论】:

      【解决方案4】:

      你的 onPreExecute 方法是错误的,就像

      ProgressDialog dialog;
      
          @Override
          protected void onPreExecute() {
              super.onPreExecute();
              dialog = new ProgressDialog(FileOperations.this);
              dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
              dialog.setMax(100);
              dialog.show();
      
          }
      

      并从 doInBackground 中删除 dialog.dismiss() 并将其添加到 onPostExecute 方法中,它会像这样..

      @Override
          protected void onPostExecute(String result) {
              super.onPostExecute(result);
      
              viewResults.setText(result);
      
              if (dialog.isShowing())
                  dialog.dismiss();
          }
      

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多