【问题标题】:Null Pointer Exception in Asyc task inside Fragments片段内的异步任务中的空指针异常
【发布时间】:2014-03-04 05:39:52
【问题描述】:

当我尝试从 Fragment onCreateView 调用 AsyncTask 时出现空指针异常。发送请求时我还必须显示进度对话框。

** 在 GrIsHu 的建议之后,我得到了例外**

  03-04 11:16:42.762: E/AndroidRuntime(10435): FATAL EXCEPTION: main
03-04 11:16:42.762: E/AndroidRuntime(10435): java.lang.NullPointerException
03-04 11:16:42.762: E/AndroidRuntime(10435):    at com.test.newinfiniteapp.RequestClient.onPreExecute(RequestClient.java:25)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.os.AsyncTask.execute(AsyncTask.java:534)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at com.test.newinfiniteapp.PendingApprovals.postHttpRequest(PendingApprovals.java:295)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at com.test.newinfiniteapp.PendingApprovals.onCreateView(PendingApprovals.java:49)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.os.Handler.handleCallback(Handler.java:800)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.os.Handler.dispatchMessage(Handler.java:100)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.os.Looper.loop(Looper.java:194)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at android.app.ActivityThread.main(ActivityThread.java:5371)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at java.lang.reflect.Method.invokeNative(Native Method)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at java.lang.reflect.Method.invoke(Method.java:525)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-04 11:16:42.762: E/AndroidRuntime(10435):    at dalvik.system.NativeStart.main(Native Method)

异步任务

public class RequestClient  extends AsyncTask<String, Void, String>{
    Context context;
    CallBack callBack;

    public RequestClient (CallBack callBack) {
        this.callBack = callBack;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Main.progressDialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        String responseString="";
        HttpClient client = null;
        try {
            client = new DefaultHttpClient();  
            HttpGet get = new HttpGet(param[0]);
            client.getParams().setParameter("http.socket.timeout", 6000);
            client.getParams().setParameter("http.connection.timeout", 6000);
            HttpResponse responseGet = client.execute(get);  
            HttpEntity resEntityGet = responseGet.getEntity();  
            if (resEntityGet != null) {  
                responseString = EntityUtils.toString(resEntityGet);
                Log.i("GET RESPONSE", responseString.trim());
            }
        } catch (Exception e) {
            Log.d("ANDRO_ASYNC_ERROR", "Error is "+e.toString());
        }
        Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim());
        client.getConnectionManager().shutdown();
        return responseString.trim();
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        callBack.run(result);
        Main.progressDialog.dismiss();
    }


}

主类

public class Main extends Fragment {

    public static ProgressDialog progressDialog;
    final Context context = getActivity();
    public static String url = ConfigUrl.MainUrl;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity,
                container, false);
        progressDialog = new ProgressDialog(context);
        progressDialog.setMessage("Please Wait .!!!");
        progressDialog.setIndeterminate(false);
        progressDialog.setProgressStyle(ProgressDialog.THEME_HOLO_DARK);
        progressDialog.setCancelable(false);
        postHttpRequest();

        return rootView;
    }

    private void postHttpRequest() {
        RequestClient reqClient = new RequestClient(new CallBack() {

            @Override
            public void run(Object result) {
                try {
                String AppResponse = (String) result;
                Log.d("Status recived", AppResponse);


                } catch (Exception e) {
                    Log.e("Exception Occured", "Exception is " + e.getMessage());
                }
            }
        });
        reqClient.execute(url);

    }
}

请帮助我如何做到这一点。我不想创建异步任务的内部类

【问题讨论】:

  • 我不明白。你到底想要什么?
  • 可能是因为这行progressDialog.setProgressStyle(ProgressDialog.THEME_HOLO_DARK);把它去掉再试一次..
  • 哪一行是你PendingApprovals.java类的第41行?
  • @SimplePlan 我想在片段中实现异步任务
  • 在 TobeAsync 中创建对话框对象并自行测试?

标签: android android-layout android-fragments android-asynctask


【解决方案1】:

首先在onCreateView 方法中定义context

final Context context;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.activity,
            container, false);
      context = getActivity();

【讨论】:

  • 该错误已被删除,现在我得到了不同的异常,现在我在我的问题中发布了该异常
  • 您的 ProgressDialog 无法获取 Main Fragment 内的 ProgressDialog 的实际引用。
  • 所以你能建议我做什么
  • 首先告诉我为什么要在另一个片段中定义 ProgressDialog 并从那里访问?你不能只在你的TobeAsync 中定义它吗?
  • 从那个片段中看到我已经定义了 ProgressDialog 以及当我在异步任务中调用 ProgressDialog 时
【解决方案2】:
progressDialog.setProgressStyle(ProgressDialog.THEME_HOLO_DARK);

【讨论】:

  • @abcd... 围绕您的答案进行一些描述,以使其更易于理解
  • 这叫做ROCKET ANSWER
【解决方案3】:

使用下面的方式

RegisterAsync extends AsyncTask<String, Void, AsyncTaskResult<JSONObject>> {


    ProgressDialog dlg;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dlg = new ProgressDialog(context); 
        dlg.setCanceledOnTouchOutside(false);
        dlg.setCancelable(false);      
        dlg.setMessage("Please wait...."); 
        dlg.show();
    }

    @Override
    protected AsyncTaskResult<JSONObject> doInBackground(String... params) {
        //do your stuff
    }


    protected void onPostExecute(AsyncTaskResult<JSONObject>  result) {
            }

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多