0

我注意到在AsyncTask中发生崩溃的某些设备上存在问题。它在我的平板电脑和智能手机上没有问题,但我的朋友在他的设备上遇到问题。Android - AsyncTask上的RuntimeException

这是我的AsyncTasks中的一个的主体的实例:

protected String doInBackground(String... params) { 
    String result = ""; 
    HttpClient httpclient = GlobalValues.getHttpClient(); 
    HttpPost httppost = new HttpPost(String.format(GlobalValues.getServiceUrl() + "%s", params[0])); 

    try { 
     HttpResponse response = httpclient.execute(httppost, GlobalValues.getLocalContext()); 
     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      InputStream instream = entity.getContent(); 
      result = GlobalValues.convertStreamToString(instream); 
      Log.i(params[0], params[0] + ": " + result); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

LOG:

FATAL EXCEPTION: AsyncTask #1 
java.lang.RuntimeException: An error occured while executing doInBackground() 
... 
Caused by: java.lang.NullPointerException 
... 

在线路中发生的错误:

HttpResponse response = httpclient.execute(httppost, GlobalValues.getLocalContext()); 

httppost包含服务器url,它是在GlobalValues.getServiceUrl()和params []的帮助下在方法内部设置的。会话cookie存储在一个HttpContext中,它是从GlobalValues.getLocalContext()中检索的,当应用程序第一次启动并由我的所有AsyncTasks共享时设置。我不明白可能抛出NullPointerException的位置。

我看过其他问题/答案,但还没有找到解决方案。

  • 的LocalContext共享
  • InputStream的在响应的HttpResponse闭合= httpclient.execute(httppost,GlobalValues.getLocalContext())。

有没有人遇到过这个& /知道可能是什么问题?

编辑:

启动活动 -

private DefaultHttpClient httpclient; 
private HttpContext localContext; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    httpclient = new DefaultHttpClient(); 
    localContext = new BasicHttpContext(); 

    CookieStore cookieStore = new BasicCookieStore(); 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

    GlobalValues.setHttpClient(httpclient); 
    GlobalValues.setLocalContext(localContext); 

GlobalValues -

protected static DefaultHttpClient httpclient; 
protected static HttpContext localContext; 

public static final DefaultHttpClient getHttpClient() { 
    return httpclient; 
} 

public static final HttpContext getLocalContext() { 
    return localContext; 
} 

public static final void setHttpClient(DefaultHttpClient httpclient) { 
    GlobalValues.httpclient = httpclient; 
} 

public static final void setLocalContext(HttpContext localContext) { 
    GlobalValues.localContext = localContext; 
} 

更新:我已经发现,当有人试图恢复应用程序的问题只发生。我通过在GlobalValues.getHttpClient()和GlobalValues.getLocalContext()中添加“if(null)re-instantiate variable”来阻止应用程序崩溃。但是,存储在LocalContext中的会话cookie会丢失。任何想法如何重新实例化值或变量而不会丢失数据?

+0

该行中的'NullPointerException'意味着'httpclient'已经'null' - 从您的代码指向'GlobalValues.getHttpClient()'。你能给我们来源吗? – dst

+0

我忘了HttpClient - 我已经按照你的要求添加了代码段 – lgdroid57

回答

1

在该行的NullPointerException意味着httpclient一直null制造商 - 从你的代码点GlobalValues.getHttpClient(),从一个static场读取。

你instanciate你的静态字段onCreate方法另一个活动。这将不是工作,因为android可能会杀死你的应用程序,并重新创建只有可见的活动。在这种情况下,您的初始化代码不会被调用。


快速修复:更改GlobalValues类做初始化工作:

protected static DefaultHttpClient httpclient = new DefaultHttpClient(); 

GlobalValues类似乎有点像你尝试了 “Singleton模式”,见an answer about singleton patterns in general,和将所有施工代码移至GlobalValues构造函数中。这样,在使用静态特征之前调用所有构造代码。

+0

感谢你的建议 - 我会试试看。 – lgdroid57

+0

仍然遇到问题... – lgdroid57

+0

@ lgdroid57有什么问题? logcat的? – dst

0

您的GlobalValues是否有可能被另一个异步进程踩踏?

另外,并非所有的Android都是相同的。你的朋友可能有一个电话从实现的AsyncTask不同足以引起问题

相关问题