【问题标题】:Android intent call gives error in asynctask onPostExecute() methodAndroid 意图调用在 asynctask onPostExecute() 方法中给出错误
【发布时间】:2013-08-19 14:53:31
【问题描述】:

嘿,我的问题与 android 中的意图和异步任务有关,我有以下代码,我从按钮启动异步任务

Button.OnClickListener buttonSignin = new Button.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

         ConnectivityManager connMgr = (ConnectivityManager) 
                    getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
                if (networkInfo == null && networkInfo.isConnected() == false) {
                    Toast.makeText(getApplicationContext(), "No Internet connection", Toast.LENGTH_SHORT).show();                   
                } 
                else if(editUserName.getText().length() == 0 && editPassword.getText().length() == 0){
               Toast.makeText(getApplicationContext(), "Please fill required details", Toast.LENGTH_SHORT).show();
               }else{
                   enteredUserName = editUserName.getText().toString();
                    password = editPassword.getText().toString();

                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                    nameValuePairs.add(new BasicNameValuePair("username", enteredUserName));
                    nameValuePairs.add(new BasicNameValuePair("password", password));
                   atn = new AsyncTaskNetwork();
                   atn.execute("http://staff.faharitech.com/raphael/hirizi/api/public/v1/user/login",nameValuePairs);

                // new sendLoginDetails().execute("http://staff.faharitech.com/raphael/hirizi/api/public/v1/user/login");       
    }

异步任务在另一个公共类中

public class AsyncTaskNetwork extends AsyncTask<Object, Integer, String> {
    ConnectToAPI conn;
    LoginActivity la;

    @Override
    protected String doInBackground(Object... params) {
        // TODO Auto-generated method stub

        String result = null;
         try {
             conn = new ConnectToAPI();
             String url = (String) params[0];
             List<NameValuePair> nameValuePairs =  ( List<NameValuePair>) params[1];
             result = conn.postData(url, nameValuePairs);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result){
        la = new LoginActivity();
        la.parseJsonData(result);
    }

}

最后被调用的方法 onPostExecute 与启动异步任务的按钮在同一个类中

public void parseJsonData(String result){
    try{
        JSONObject json_data = new JSONObject(result);          

        if(json_data != null){
        JSONObject jObj = json_data.getJSONObject("user");
        if(jObj != null){
        JSONObject jObj2 =null;
        username = jObj.getString("username");
        System.out.println(username);
        token = jObj.getString("token");
        System.out.println(token);
        fullName = jObj.getString("full name");
        System.out.println(fullName);
        profilePic = jObj.getString("profilePic");
        System.out.println(profilePic);         
        System.out.println(jObj.getString("stores"));
        JSONArray jArray = new JSONArray(jObj.getString("stores"));


        for(int i = 0; i < jArray.length(); i++){
            jObj2 = jArray.getJSONObject(i);
            sName = jObj2.getString("name");
            System.out.println(sName);
            sId = jObj2.getString("id");
            System.out.println(sId);
            logo = jObj2.getString("logo");
            System.out.println(logo);       
        }


        displayResults = username + " " + token;
        }
        else{
        JSONObject jObjMessage = json_data.getJSONObject("message");
        errMessage = jObjMessage.getString("message");
        displayResults = errMessage;
        }
        }
        }catch(JSONException e){
            Log.e("log_tag", "Error parsing data "+e.toString());

    }

    if(username != null && token != null){
        Intent intent = new Intent(getApplicationContext(),NavigationActivity.class);
        startActivity(intent);          
    }
    else{
        Toast.makeText(getApplicationContext(),errMessage, 10000000).show();
    }
}

我的问题是在意图调用 nullpointerexception 时出现错误,这与上下文有关,除了 getApplicationContext() 之外,我应该在那里使用哪个上下文

更新日志

    08-19 14:59:45.649: E/AndroidRuntime(6897): FATAL EXCEPTION: main
08-19 14:59:45.649: E/AndroidRuntime(6897): java.lang.NullPointerException
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.content.ComponentName.<init>(ComponentName.java:75)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.content.Intent.<init>(Intent.java:3491)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at com.faharitech.hirizi.LoginActivity.parseJsonData(LoginActivity.java:336)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at com.faharitech.hirizi.AsyncTaskNetwork.onPostExecute(AsyncTaskNetwork.java:36)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at com.faharitech.hirizi.AsyncTaskNetwork.onPostExecute(AsyncTaskNetwork.java:1)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.os.AsyncTask.finish(AsyncTask.java:631)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.os.Looper.loop(Looper.java:137)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at android.app.ActivityThread.main(ActivityThread.java:5041)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at java.lang.reflect.Method.invokeNative(Native Method)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at java.lang.reflect.Method.invoke(Method.java:511)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-19 14:59:45.649: E/AndroidRuntime(6897):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 我无法想象这个la = new LoginActivity(); 可以在任何 Android 应用程序中工作。你为什么要这么做?
  • 请粘贴logcat。
  • 确保 getApplicationContext() 不为空。
  • 感谢@RiteshGune,但我该怎么做,或者我可以使用其他替代方法
  • 您可以传递活动上下文并使用它来代替应用程序上下文。那会解决你的问题。

标签: android android-intent android-asynctask


【解决方案1】:

你必须使用你的活动名称点这个,示例:

YourActivity.this

【讨论】:

  • 把这个:@Override protected void onPostExecute(String result){ la = new LoginActivity(); la.parseJsonData(result); } 改成这个:@Override protected void onPostExecute(String result){ this.parseJsonData(result); }
【解决方案2】:

单独吐司有用吗? 如果其他答案不起作用,请尝试在活动类中定义 asyntask。(应该)

【讨论】:

  • 将 AsyncTaskNetwork 类复制到正在使用它的类中
【解决方案3】:

为您的AsyncTaskNetwork 创建一个构造函数,并将Context 作为参数。将AsyncTaskNetwork的成员变量声明为Context mContext并在构造函数中初始化。即

public class AsyncTaskNetwork extends AsyncTask<Object, Integer, String> {
    ConnectToAPI conn;
    LoginActivity la;
    Context mContext;


public AsyncTaskNetwork(Context context){

    this.mContext=context;
  }
 .........
}

在调用Intent的时候,可以传递这个上下文。即

Intent intent = new Intent(mContext,NavigationActivity.class);
        startActivity(intent);   

【讨论】:

  • 谢谢@Mukesh Kumar,问题是意图调用是从启动异步任务的同一个类进行的,即 LoginActivity 所以单独的 mContext 不起作用你有其他解决方案吗
猜你喜欢
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多